sql - 如何删除重复的组键值并显示详细信息项(多组)

标签 sql sql-server database tsql window-functions

源数据和 DDL

CREATE TABLE T
    ([Order_NO] varchar(10), [MO_NO] varchar(10), [DEP] varchar(3), [PRD_NO] varchar(12), [QTY] int, [STD_QTY] numeric, [QTY_DIF] numeric);

INSERT INTO T
    ([Order_NO], [MO_NO], [DEP], [PRD_NO], [QTY], [STD_QTY], [QTY_DIF])
VALUES
    ('SO17110026', 'MO17110824', 'MO2', '3CA002-00120', 40681, 40380.48, 300.52),
    ('SO17110026', 'MO17110824', 'MO2', '3CA002A00110', 41125, 40380.48, 744.52),
    ('SO17110026', 'MO17110825', 'MO1', '403010060002', 40381, 40380.48, 0.52),
    ('SO17110026', 'MO17110825', 'MO1', '601001000734', 69, 68.102, 0.898),
    ('SO17110026', 'MO17110826', 'MO1', '601002000004', 2862, 2861.4858, 0.5142),
    ('SO17110026', 'MO17110826', 'MO1', '601005000127', 1499, 1498.6446, 0.3554),
    ('SO17110026', 'MO17110826', 'MO1', '601007000001', 69, 68.102, 0.898),
    ('SO17110029', 'MO17110825', 'MO1', '40107008CM01', 238010, 237658.3374, 351.6626),
    ('SO17110029', 'MO17110825', 'MO1', '40107008CM33', 110000, 109149.843, 850.157)
;
Order_NO   | MO_NO      | DEP | PRD_NO       |    QTY | STD_QTY | QTY_DIF
:--------- | :--------- | :-- | :----------- | -----: | :------ | :------
SO17110026 | MO17110824 | MO2 | 3CA002-00120 |  40681 | 40380   | 301    
SO17110026 | MO17110824 | MO2 | 3CA002A00110 |  41125 | 40380   | 745    
SO17110026 | MO17110825 | MO1 | 403010060002 |  40381 | 40380   | 1      
SO17110026 | MO17110825 | MO1 | 601001000734 |     69 | 68      | 1      
SO17110026 | MO17110826 | MO1 | 601002000004 |   2862 | 2861    | 1      
SO17110026 | MO17110826 | MO1 | 601005000127 |   1499 | 1499    | 0      
SO17110026 | MO17110826 | MO1 | 601007000001 |     69 | 68      | 1      
SO17110029 | MO17110825 | MO1 | 40107008CM01 | 238010 | 237658  | 352    
SO17110029 | MO17110825 | MO1 | 40107008CM33 | 110000 | 109150  | 850    

期待结果

Order_NO   | MO_NO      | DEP  | PRD_NO       |    QTY | STD_QTY | QTY_DIF
:--------- | :--------- | :--- | :----------- | -----: | :------ | :------
SO17110026 | MO17110824 | MO2  | 3CA002-00120 |  40681 | 40380   | 301    
null       | null       | null | 3CA002A00110 |  41125 | 40380   | 745    
null       | MO17110825 | MO1  | 403010060002 |  40381 | 40380   | 1      
null       | null       | null | 601001000734 |     69 | 68      | 1      
null       | MO17110826 | MO1  | 601002000004 |   2862 | 2861    | 1      
null       | null       | null | 601005000127 |   1499 | 1499    | 0      
null       | null       | null | 601007000001 |     69 | 68      | 1      
SO17110029 | MO17110825 | MO1  | 40107008CM01 | 238010 | 237658  | 352    
null       | null       | null | 40107008CM33 | 110000 | 109150  | 850    

演示测试链接:db<>fiddle

最佳答案

我们可以使用 ROW_NUMBER 来处理这个问题:

SELECT
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY Order_NO ORDER BY MO_NO, PRD_NO) = 1
         THEN Order_NO END AS Order_NO,
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY Order_NO, MO_NO ORDER BY PRD_NO) = 1
         THEN MO_NO END AS MO_NO,
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY Order_NO, MO_NO ORDER BY PRD_NO) = 1
         THEN DEP END AS DEP,
    PRD_NO,
    QTY,
    STD_QTY,
    QTY_DIF
FROM T
ORDER BY
    T.Order_NO,
    T.MO_NO,
    T.PRD_NO;

enter image description here

Demo

关于sql - 如何删除重复的组键值并显示详细信息项(多组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896739/

相关文章:

sql - 在 SQL Server 2017 中修改多个 JSON 数组元素

c# - 检索 VARCHAR(MAX)

sql-server - ACOS 函数的 SQL 2012 错误

sql - SQL Server 中的左外连接

sql-server - 如何将数据库从一台计算机复制到另一台计算机?

mysql 使用同一表中的行作为条件?

sql - 将 Datetime 格式转换为 varchar 格式样式的解决方法

sql-server - 无法使用 SQL Server 中的用户定义函数在 View 上创建索引

database - 即使我们事先不知道键(或键范围),是否可以使用 cassandra 查询一个值(或一个值集)?

database - 我如何在 sqlite 数据库中使用 Unicode 字符,例如日耳曼元音变音符?