excel 如何在大数组中查找数据

zujrkrfu  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在寻找有关如何搜索或查找与特定数据行相关的数据的建议。运行Microsoft Excel 365和SQL Server 2014。在我的情况下,我将作业行存储在SQL表中。第二个表包含多个制造工序,编号从1到多,与每行相关。

职务明细列表

工作编号组件编号组装件部件编号
千零一0A1
小行星10020地下一层
小行星10021B10
小行星1002第二章B11
10030C1
10031碳十

作业操作列表

工作编号组件编号OpSeq操作代码小时
千零一010个MF第1.2条
千零一0二十FA2.0版
千零一0三十油漆0.5分
小行星1002010个MF二、五
小行星1002110个MF1.5岁
小行星10021二十制备1.0分
小行星10021三十油漆1.5岁
小行星1002第二章10个FA0.5分
小行星1002第二章二十打包0.5分

“作业详细信息”行存储在以下位置

Public Type JobStatusDetailLine
    JobNum As String
    AssemblySeq As Integer
    PartNum As String
    ...
End Type

Public JobStatusDetailArr() As JobStatusDetailLine

工单工序列表

Public Type JobStatusOperations
    JobNum As String
    AssemblySeq As Integer
    OpSeq As Integer
    OpCode As String
    Hours As Double
    ...
End Type

Public JobStatusOperationArr() As JobStatusOperations

Excel表格输出

工作编号操作编号操作1操作2操作3
千零一0MFFA油漆
小行星10020MF- -- -
小行星10021MF制备油漆
小行星1002第二章FA打包- -

当前,我将所有职务行读入JobStatusDetailArr,然后遍历数组,向Excel表中添加新行。在每次迭代中,我查找该作业的操作并将其读入JobStatusOperationArr。然后遍历数组,并将每个操作追加为表中行的一列。根据作业行数和每个作业的操作数(某些作业可能有20 - 30个操作),生成表的速度可能会很慢。
另一种方法可能是将每个作业的所有操作读入一个大数组中,但我不知道一种有效的方法来查找与当前作业行相关的操作,因为我迭代了JobStatusDetailArr来构建每个表行。
查找每个作业行的工序的更好方法是什么?
此外,有条件格式的表操作单元格的基础上的操作小时数和操作是否完成(没有显示在我的操作表)

fnvucqvd

fnvucqvd1#

尽量不要考虑行,尤其是当数据在SQL数据库中时。SQL是基于集合的,不需要使用循环。可以从SQL表中提取数据,其中每行都已使用所需数据构建
我用以下示例数据模拟了SQL表

declare @JobDetail table(jobno varchar(5), assemblyno int, partno varchar(5));
insert into @JobDetail(jobno, assemblyno, partno) values
 ('1001',0,'A1')
,('1002',0,'B1')
,('1002',1,'B10')
,('1002',2,'B11')
,('1003',0,'C1')
,('1003',1,'C10');

declare @JobOperation table (jobno varchar(5), assemblyno int, opseq int, opcode varchar(5), [hours] decimal(15,2));
insert into @JobOperation(jobno, assemblyno, opseq, opcode, [hours]) values
 ('1001',0,10,'MF',1.2)
,('1001',0,20,'FA',2.0)
,('1001',0,30,'Paint',0.5)
,('1002',0,10,'MF',2.5)
,('1002',1,10,'MF',1.5)
,('1002',1,20,'Prep ',1.0)
,('1002',1,30,'Paint',1.5)
,('1002',2,10,'FA',0.5)
,('1002',2,20,'Pack ',0.5);

然后数据提取可能看起来像这样

select jobno, assemblyno
    ,MAX(ISNULL([10],'-')) AS OP1
    ,MAX(ISNULL([20],'-')) AS OP2
    ,MAX(ISNULL([30],'-')) AS OP3
    ,SUM(ISNULL([hours],0)) as tothours
from
(
    select a.jobno, a.assemblyno, b.opseq, b.opcode, b.hours
    from @JobDetail a
    left join @JobOperation b on a.jobno = b.jobno and a.assemblyno = b.assemblyno
) src
PIVOT
(
    MAX(OPCODE) for opseq in ([10],[20],[30])
) pvt
where [10] is not null or [20] is not null or [30] is not null
group by jobno, assemblyno
ORDER BY jobno, assemblyno;

结果

jobno   assemblyno  OP1 OP2     OP3     tothours
1001    0           MF  FA      Paint   3.70
1002    0           MF  -       -       2.50
1002    1           MF  Prep    Paint   2.50
1002    2           FA  Pack    -       0.50

如果您希望将数据单独保存在工作簿中,那么就像@ cetinbasoz建议的那样,使用数据透视表即可

相关问题