2012-02-27 63 views
1

我想寫一個SQL語句,它將從源表數據創建一個展平的表。這就是我要做的:從源表數據創建一個展平的記錄

  • 得到的地位和其數量之和爲訂單ID的組合,PARTID

我試圖與基於案例的表達下面的查詢來實現:

SELECT orderid, partid, 
     SUM(quantity) as total, 
     status1 = case [status] when 1 then SUM(quantity) else null end, 
     status2 = case [status] when 2 then SUM(quantity) else null end, 
     status3 = case [status] when 3 then SUM(quantity) else null end 
FROM partsum 
GROUP BY orderid, 
      partid, 
      status; 

但結果不是我所要求的。我知道我是分組的狀態,但查詢不會將它添加到列表中進行編譯。

enter image description here

回答

1

還有一堆的方法來寫這個。我也將你的零點轉換爲零,但如果這是你真正需要的,它可能很容易將它們切換回零。沒有指定SQL的whic版本,所以這裏有兩種解決方案,將工作:

一個SQL 2005+版本:

SELECT DISTINCT 
     OrderID, 
     PartID, 
     SUM(Quantity) OVER (PARTITION BY PartID) as Total, 
     SUM(case [status] when 1 then quantity else 0 end) 
       OVER (Partition By PartID) as Status1, 
     SUM(case [status] when 2 then quantity else 0 end) 
       OVER (Partition By PartID) as Status2, 
     SUM(case [status] when 3 then quantity else 0 end) 
       OVER (Partition By PartID)as Status3 
FROM PartSum 

應該在任何版本(以及任何我的意思是至少背到SQL 6.5):

SELECT 
     OrderID, 
     PartID, 
     SUM(Quantity) as Total, 
     SUM(case [status] when 1 then quantity else 0 end) as Status1, 
     SUM(case [status] when 2 then quantity else 0 end) as Status2, 
     SUM(case [status] when 3 then quantity else 0 end) as Status3 
FROM PartSum 
GROUP BY orderid, 
      partid 
+0

@第二個爲我工作。第一個 - 因爲我缺乏T-SQL的經驗 - 無法獲得組記錄(在我的實際代碼中)。爲了更好地理解,我需要學習Over和Partition。我們可以同時使用和,OVER&PARTITION組合嗎? – TheMar 2012-02-27 15:55:54

+0

第一個使用了DISTINCT,並且不能以當前形式使用分組。 – EBarr 2012-02-27 16:07:47

+0

@ EBarr-我的困惑實際上在於PartitionBy PartID是否在select語句的所有其他行上進行分組? – TheMar 2012-02-27 16:16:45

1

嘗試是這樣的:

SELECT DISTINCT [Order].OrderID, 
    [Order].PartID, 
    [Order].Total, 
    Status1.Status AS Status1, 
    Status2.Status AS Status2, 
    Status3.Status AS Status3 
FROM 
    (SELECT OrderID, PartID, SUM(Quantity) AS Total 
     FROM PartSum 
     GROUP BY OrderID, PartID) [Order] 
    LEFT JOIN PartSum Status1 ON [Order].OrderID = Status1.OrderID AND [Order].PartID = Status1.PartID AND Status1.Status = 1 
    LEFT JOIN PartSum Status2 ON [Order].OrderID = Status2.OrderID AND [Order].PartID = Status2.PartID AND Status2.Status = 2 
    LEFT JOIN PartSum Status3 ON [Order].OrderID = Status3.OrderID AND [Order].PartID = Status2.PartID AND Status3.Status = 3 

這是假設你有一個固定的NUM可能的狀態代碼。

+0

謝謝。你的答案確實奏效(我加了獨特的關鍵詞)。我期待着像EBarr的第二個選項那樣去處理它。 – TheMar 2012-02-27 16:01:45

相關問題