2013-05-09 11 views
2

我有這樣的查詢:在union - group中共享行?

SELECT * FROM (
    SELECT id, SUM(orderLineTotal) as orderLine1, NULL as orderLine 2 
    FROM Orders 
    WHERE Orders.Date < @Today 
    GROUP BY id 

    UNION 

    SELECT id, NULL as orderLine1, SUM(orderLineTotal2) as orderLine 2 
    FROM Orders 
    WHERE Orders.Date = @Today 
    GROUP BY id 
) o 
GROUP BY o.id, o.orderLine1, o.orderLine2 

我得到類似下面的結果:

ID   OrderLine1   OrderLine2 
----------------------------------------- 
1   105.00    NULL 
1   NULL    204.00 
2   49.30    NULL 
2   NULL    94.24 

有什麼辦法來修改查詢返回這樣的事情?

ID   OrderLine1   OrderLine2 
----------------------------------------- 
1   105.00    204.00 
2   49.30    94.24 
+0

最快的方法是利用你的aggegation並將選擇邏輯改爲SELECT ID,Max(OrderLine1),Max(OrderLine2)',但@GordonLinoff答案更好。 – 2013-05-09 18:06:32

回答

4

你想使用一個查詢和條件聚集做到這一點:

SELECT id, 
      SUM(case when Orders.Date < @Today then orderLineTotal end) as orderLine1, 
      SUM(case when Orders.Date = @Today then orderLineTotal2 end) as orderLine2 
    FROM Orders 
    GROUP BY id 

順便說一句,是真的有兩列,orderLineTotalorderLineTotal2?我懷疑只有一個,第二個sum()應該相應地改變。

+0

你在這個假設中是正確的。我極大地簡化了我的查詢,試圖幫助澄清。 – 2013-05-09 18:03:23