如何汇总具有相同测试结果的序列号列表
How to summarize a list of serial numbers that have the same test result
我已将序列化的部件发送出去进行测试。这些序列号被分配到一个与车间订单号相关联的“容器”。这一切都是在纸上手动跟踪的,我想使用 SSRS 报告生成器按显示容器和相关序列号的车间订单创建报告。我按容器编号分组,显示序列号列表,无论它们通过还是失败,然后显示序列号的计数。我设法做到了这一切,但报告长达数十页。我想在显示第一个序列号和最后一个序列号的一行中汇总所有具有相同状态的连续序列号。下一行将包含具有不同状态的连续出版物的汇总顺序列表。等等等等。在执行此操作时,我仍然需要显示该容器中的连续剧数量。
(不幸的是,我目前在这个网站上的状态只允许我附上图片。)
由于您没有用您正在使用的 SQL 服务器版本标记您的问题,我假设这是一个相当新的版本...
在 SSRS 中执行此操作会很棘手,所以这就是我的处理方式。其他人可能想出了一个更优雅的方法,但如果没有,至少你有这个解决方案...
我在 table 变量中复制了你的数据集,然后派生了一个列来检查具有相同 ShopOrder
、ContNumber
和 TestResult
的先前记录是否具有序号比现在少一位
然后将其包装在一个查询中,该查询通过对该派生列进行 运行 求和来添加 'Batch' 数字。最后我得到每个批次的 MIN 和 MAX 值,并将它们连接到一个字符串中作为最终输出。
代码看起来像这样...
DECLARE @t TABLE (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
最终输出如下所示,我不确定您是如何计算记录的,但也提供了每个批次的记录数。
我已将序列化的部件发送出去进行测试。这些序列号被分配到一个与车间订单号相关联的“容器”。这一切都是在纸上手动跟踪的,我想使用 SSRS 报告生成器按显示容器和相关序列号的车间订单创建报告。我按容器编号分组,显示序列号列表,无论它们通过还是失败,然后显示序列号的计数。我设法做到了这一切,但报告长达数十页。我想在显示第一个序列号和最后一个序列号的一行中汇总所有具有相同状态的连续序列号。下一行将包含具有不同状态的连续出版物的汇总顺序列表。等等等等。在执行此操作时,我仍然需要显示该容器中的连续剧数量。
(不幸的是,我目前在这个网站上的状态只允许我附上图片。)
由于您没有用您正在使用的 SQL 服务器版本标记您的问题,我假设这是一个相当新的版本...
在 SSRS 中执行此操作会很棘手,所以这就是我的处理方式。其他人可能想出了一个更优雅的方法,但如果没有,至少你有这个解决方案...
我在 table 变量中复制了你的数据集,然后派生了一个列来检查具有相同 ShopOrder
、ContNumber
和 TestResult
的先前记录是否具有序号比现在少一位
然后将其包装在一个查询中,该查询通过对该派生列进行 运行 求和来添加 'Batch' 数字。最后我得到每个批次的 MIN 和 MAX 值,并将它们连接到一个字符串中作为最终输出。
代码看起来像这样...
DECLARE @t TABLE (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
最终输出如下所示,我不确定您是如何计算记录的,但也提供了每个批次的记录数。