首页 > 解决方案 > 如何汇总测试结果相同的序列号列表

问题描述

我已经序列化了发送出去进行测试的部件。这些序列号被分配给与车间订单号相关联的“容器”。这一切都是在纸上手动跟踪的,我想使用 SSRS Report Builder 创建一个报告,按显示容器和相关序列号的车间订单。我按容器号分组,显示序列号列表,它们是通过还是失败,然后显示序列号计数。我已经设法做到了这一切,但报告有几十页长。我想在一行上汇总所有具有相同状态的连续序列号,显示第一个序列号和最后一个序列号。下一行将包含具有不同状态的连续序列的汇总列表。等等等等。在这样做的同时,

当前查询结果

未来(期望)查询结果

(不幸的是,我目前在这个网站上的状态只允许我附上图片。)

标签: sql-serverreporting-services

解决方案


由于您没有用您正在使用的 SQL Server 版本标记您的问题,我假设它是一个相当新的版本......

在 SSRS 中这样做会很棘手,所以这就是我的处理方法。其他人可能会想出一个更优雅的方式,但如果没有,至少你有这个解决方案......

我在表变量中复制了您的数据集,然后派生了一个列,该列检查前一条记录是否具有相同的ShopOrder, ContNumber,并且TestResult序列号比当前记录少一。

然后将其包装在一个查询中,该查询通过对该派生列进行运行求和来添加“批次”编号。最后,我得到每个批次的 MIN 和 MAX 值,并将它们连接到一个字符串中以用于最终输出。

代码看起来像这样......

声明 @t 表(ShopOrder varchar(10)、ContNumber varchar(10)、SerialNo int、TestResult varchar(10))

INSERT INTO @t VALUES 
    ('ABC13-A', 'CONT-A', 13352  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13353  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13354  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13355  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13356  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13357  , 'Accept'),

    ('ABC13-A', 'CONT-A', 13359  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13360  , 'Reject'),
    ('ABC13-A', 'CONT-A', 13361  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13362  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13363  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13364  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13365  , 'Reject'),
    ('ABC13-A', 'CONT-A', 13366  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13367  , 'Accept'),
    ('ABC13-A', 'CONT-A', 13368  , 'Accept')

--

SELECT DISTINCT
    ShopOrder, ContNumber
    , SerialNos = IIF(
                    MIN(SerialNo) OVER(PARTITION BY Batch) = Max(SerialNo) OVER(PARTITION BY Batch)
                    , CONCAT('',MIN(SerialNo) OVER(PARTITION BY Batch))
                    , CONCAT(MIN(SerialNo) OVER(PARTITION BY Batch), ' - ', Max(SerialNo) OVER(PARTITION BY Batch))
                    )
    , TestResult
    , RecCount = COUNT(*) OVER(PARTITION BY Batch)
    FROM (
            SELECT 
                    *
                    , Batch = SUM(IsFirstSerial) OVER(ORDER BY RowN)
                FROM 
                    (
                    SELECT 
                            *
                            , IsFirstSerial = IIF(LAG(RowN, 1) OVER(PARTITION BY ShopOrder, ContNumber, TestResult ORDER BY RowN) = RowN - 1, 0,1)
                        FROM (SELECT *, RowN = ROW_NUMBER() OVER(ORDER BY SerialNo) FROM @t) a 
                    ) x
    ) z

最终输出如下所示,我不确定您是如何计算记录的,但还提供了每个批次的记录计数。

在此处输入图像描述


推荐阅读