SQL Server : merge subqueries without duplicate

标签 sql sql-server t-sql

我想将这个结果合并为两行,有什么方法可以做到吗?提前致谢!

当前结果:

cust-no     document    order-no    Black Description          Black CR     Yellow Description           Yellow CR
CE074L00    10012107    0           NULL                       NULL         841437 P.CART YLW C3501S;    -5
CE074L00    10012107    0           NULL                       NULL         841696 P.CART YLW C5502S;    -7
CE074L00    10012107    0           841436 P.CART BLK C3501S;  -8           NULL                         NULL
CE074L00    10012107    0           841695 P.CART BLK C5502S;  -3           NULL                         NULL

预期结果:

cust-no     document    order-no    Black Description          Black CR     Yellow Description           Yellow CR
CE074L00    10012107    0           841436 P.CART BLK C3501S;  -8           841437 P.CART YLW C3501S;    -5
CE074L00    10012107    0           841436 P.CART BLK C3501S;  -3           841696 P.CART YLW C5502S;    -7

当前 SQL 查询:

select 
    a.[cust-no], a.[document],a.[order-no],
    a.[Black Description],a.[Black CR],a.[Yellow Description],a.[Yellow CR]
from
    (select 
         i1.[cust-no], i1.[document], i1.[order-no], 
         il1.[description] [Black Description], 
         il1.[qty-shipped] [Black CR], null [Yellow Description],
         null [Yellow CR] 
     from 
         invoice i1 
     inner join 
         [invoice-line] il1 on il1.[document] = i1.[document] 
     inner join
         toner t on t.[edp code] = il1.[item-no] 
                  and t.[color] = 'black' and i1.[dbill-type] = 'PS' 
                  and i1.[invoice-date] > '2015-01-01' 
                  and i1.[order-code] = 'FOCA'
                  and i1.[cust-no] = 'CE074L00'

    union 

    select 
        i1.[cust-no], i1.[document], i1.[order-no],
        null [Black Description], null [Black CR],
        il1.[description] [Yellow Description],il1.[qty-shipped] [Yellow CR] from invoice i1 
    inner join [invoice-line] il1 on il1.[document] = i1.[document] inner join
    toner t on t.[edp code] = il1.[item-no] and t.[color] = 'yellow' and i1.[dbill-type] = 'PS' 
    and i1.[invoice-date] > '2015-01-01' 
    and i1.[order-code] = 'FOCA'
    and i1.[cust-no] = 'CE074L00') a

修改后的查询仍然只显示一行,不知道如何使用RowNo:

SELECT 
    a.[cust-no],
    a.[document],
    a.[order-no],
    MAX(CASE WHEN a.[color] = 'black' THEN a.[description] END) AS [Black Description],
    MAX(CASE WHEN a.[color] = 'black' THEN a.[qty-shipped] END) AS [Black CR],
    MAX(CASE WHEN a.[color] = 'yellow' THEN a.[description] END) AS [Yellow Description],
    MAX(CASE WHEN a.[color] = 'yellow' THEN a.[qty-shipped] END) AS [Yellow CR] 
FROM 
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY i1.[cust-no],i1.[document],i1.[order-no] ORDER BY i1.[cust-no] desc) AS RowNo,
    i1.[cust-no],i1.[document],i1.[order-no],t.[color],il1.[description],il1.[qty-shipped]
FROM 
    invoice i1 
INNER JOIN 
    [invoice-line] il1 
ON 
    il1.[document] = i1.[document]
INNER JOIN 
    toner t 
ON 
    t.[edp code] = il1.[item-no]
WHERE
    t.[color] IN('black', 'yellow')
    and i1.[dbill-type] = 'PS' 
    and i1.[invoice-date] > '20150101' 
    and i1.[order-code] = 'FOCA'
    and i1.[cust-no] = 'CE074L00'
) AS a
GROUP BY
    a.[cust-no],
    a.[document],
    a.[order-no]

修改后的查询结果:

cust-no     document    order-no    Black Description           Black CR    Yellow Description          Yellow CR
CE074L00    10012107    0           841695 P.CART BLK C5502S;   -3          841696 P.CART YLW C5502S;   -5

测试数据:

create table #Invoice(
    [document] int,
    [cust-no] varchar(15),
    [order-no] int,
    [dbill-type] varchar(15),
    [invoice-date] datetime,
    [order-code] varchar(15))

create table #Invoice_line(
    [document] int,
    [item-no] int,
    [description] varchar(100),
    [qty-shipped] int)

create table #toner(
    [edp code] int,
    [color] varchar(15))

insert into #invoice values (10012107,'CE074L00',0,'PS','2015-03-01','FOCA')
insert into #Invoice_line values (10012107,841436,'841436 P.CART BLK C3501S;',-8)
insert into #Invoice_line values (10012107,841695,'841695 P.CART BLK C5502S;',-3)
insert into #Invoice_line values (10012107,841437,'841437 P.CART YLW C3501S;',-5)
insert into #Invoice_line values (10012107,841696,'841696 P.CART YLW C5502S;',-7)
insert into #toner values(841436,'black')
insert into #toner values(841695,'black')
insert into #toner values(841437,'yellow')
insert into #toner values(841696,'yellow')

要测试的查询:

SELECT 
    a.[cust-no],
    a.[document],
    a.[order-no],
    MAX(CASE WHEN a.[color] = 'black' THEN a.[description] END) AS [Black Description],
    MAX(CASE WHEN a.[color] = 'black' THEN a.[qty-shipped] END) AS [Black CR],
    MAX(CASE WHEN a.[color] = 'yellow' THEN a.[description] END) AS [Yellow Description],
    MAX(CASE WHEN a.[color] = 'yellow' THEN a.[qty-shipped] END) AS [Yellow CR] 
FROM 
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY i1.[cust-no],i1.[document],i1.[order-no] ORDER BY i1.[cust-no] desc) AS RowNo,
        i1.[cust-no],i1.[document],i1.[order-no],t.[color],il1.[description],il1.[qty-shipped]
    FROM 
        #invoice i1 
    INNER JOIN 
        #invoice_line il1 
    ON 
        il1.[document] = i1.[document]
    INNER JOIN 
        #toner t 
    ON 
        t.[edp code] = il1.[item-no]
    WHERE
        t.[color] IN('black', 'yellow')
        and i1.[dbill-type] = 'PS' 
        and i1.[invoice-date] > '20150101' 
        and i1.[order-code] = 'FOCA'
        and i1.[cust-no] = 'CE074L00'
) AS a
GROUP BY
    a.[cust-no],
    a.[document],
    a.[order-no]

最佳答案

您可以使用基于案例的聚合条件聚合:

SELECT 
    i1.[cust-no],
    i1.[document],
    i1.[order-no],
    MAX(CASE WHEN t.[color] = 'black' THEN il1.[description] END) AS [Black Description],
    MAX(CASE WHEN t.[color] = 'black' THEN il1.[qty-shipped] END) AS [Black CR],
    MAX(CASE WHEN t.[color] = 'yellow' THEN il1.[description] END) AS [Yellow Description],
    MAX(CASE WHEN t.[color] = 'yellow' THEN il1.[qty-shipped] END) AS [Yellow CR] 
FROM invoice i1 
INNER JOIN [invoice-line] il1 
    ON il1.[document] = i1.[document]
INNER JOIN toner t 
    ON t.[edp code] = il1.[item-no]
WHERE
    t.[color] IN('black', 'yellow')
    and i1.[dbill-type] = 'PS' 
    and i1.[invoice-date] > '20150101' 
    and i1.[order-code] = 'FOCA'
    and i1.[cust-no] = 'CE074L00'
GROUP BY
    i1.[cust-no],
    i1.[document],
    i1.[order-no]

关于SQL Server : merge subqueries without duplicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485488/

相关文章:

sql - 将 SQL 消息输出到日志文件

php - MySQL:在多个列中查找相同的字符串

php - 如何获取PHP中的SQL Server触发器错误?

sql - 更新 SQL Server 2012 中的 varbinary(MAX) 字段丢失最后 4 位

sql - 根据一列的 MAX 和另一列的相关 MIN 选择行

java - 如何将 MySQL 数据库中的 id 解析为变量

mysql - 为什么 DROP PRIMARY KEY 会影响所有表行?

sql-server - 将日期转换为星期几到 SQL Server

SQL语句-更新两个表

sql - T-SQL 中的日期循环