2015-04-07 80 views
2

我想将这个结果合并成2行,任何方式来做到这一点?提前致谢 !SQL Server:合并没有重复的子查询

当前的结果:

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] 
+0

您当前的查询结果是什么? –

回答

0

@OP,似乎这是工作得很好,纠正我,如果我错了。

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], t.[color] 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] 
    , a.[RowNo] 
+0

非常感谢你,完美的工作! –

+0

我的荣幸! :) –

2

你可以使用case-based aggregationconditional aggregation

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] 
+0

Hi @wewesthemenace,如果使用** Max **,我必须用'i1。[cust-no],i1。[document],i1。[order-no]'进行分组,然后它将只产生第一行,但我期望看到两行 –

+1

您可以使用ROW_NUMBER来避免这种情况。我在另一个问题上做了很多相同的事情。 http://stackoverflow.com/questions/28736744/how-to-combine-multiple-rows-of-employee-into-single-row-in-sql-server/28737369#28737369 你可以简单地由RowNo组合而不是选择第一个。 –

+0

嗨@EvaldasBuinauskas,使用** RowNo **返回1行的值以及我期望的两行数据 –

0

Evaldas是对的。当您添加颜色给你PARTITION BY子句中你得到你所要寻找的分区:

RowNo cust-no document order-no color description qty-shipped 
1 CE074L00 10012107 0 black 841436 P.CART BLK C3501S; -8 
2 CE074L00 10012107 0 black 841695 P.CART BLK C5502S; -3 
1 CE074L00 10012107 0 yellow 841437 P.CART YLW C3501S; -5 
2 CE074L00 10012107 0 yellow 841696 P.CART YLW C5502S; -7 

当您添加RowNo到GROUP BY子句中,你会得到两行,而不是之一,因为它现在还组在RowNo上。

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 841695 P.CART BLK C5502S; -3 841696 P.CART YLW C5502S; -7