2010-12-06 81 views
0

好的,我一直沒有做SQL。這是我必須得到的最深入的。基本上我有一個表,然後根據日期分解它。SQL Pivot for multiple rows ... CONFUSED?

現在我有一個交易,通過。有3種交易類型。讓我們說交付,運送,返回。所以我的表有一個交易ID,交易日期和交易類型。我需要對此進行轉換並計算總和交易類型。我到目前爲止的代碼如下:

SELECT 
    SUM(Delivered), 
    SUM(Shipped), 
    SUM(Returned), 
    TransactionID, 
    TransactionDate 
FROM 
    (
     (SELECT 
      TransactionID, 
      TransactionDate, 
      TransactionType 
     FROM Transactions) AS Ttable 
     PIVOT 
     (
      COUNT(TransactionType) 
      FOR TransactionTYpe IN 
      (
       [Delivered], 
       [Shipped], 
       [Returned] 
      ) 
     ) as Pvt1 
    ) 

這會獲得每種交易類型的計數總和。但是,這給了我存在的所有交易類型的總計。我需要在一段時間內完成所有這些。例如(我知道這將會是很多變量,但它是我的應用程序能夠做到的唯一方式),我需要找出2010年1月 - 2012年12月每個月的所有交易類型的總和。所以12x3。我怎麼能這樣分手呢?請幫忙!快要瘋了!

回答

1

這裏有一個出發點:

SELECT TransactionMonth, [Delivered], [Shipped], [Returned] 
from (select 
      TransactionType 
     ,cast(datename(mm, TransactionDate) + ' 1, ' + datename(yy, TransactionDate) as smalldatetime) TransactionMonth 
     from Transactions) ByMonth 
pivot (count(ByMonth.TransactionType) 
     for ByMonth.TransactionType in ([Delivered],[Shipped],[Returned]) 
     ) xx 
order by TransactionMonth 

它不是完全清楚哪些源數據看起來像或您的最後一格應該是什麼,所以我做了一些假設:

  • 我承擔每個TransactionId在一個日期有一個交易。我將它從最終查詢中分解出來,並按日曆月生成總計
  • 我返回表中每個條目的結果。將具有適當日期過濾參數的where子句添加到SELECT子句以減少。
  • 我們有了一個更好的辦法來「清洗」日期時間爲「年 - 月」的形式,使用它,如果你找到它
  • 我測試了我自己的simlar表,然後轉換成你的名字 - 很確定我沒事,但是有些拼寫錯誤可能已經出現。(我正在使用SQL 2005.)
+0

問題是我需要列。所以,而不是由他們排序。我需要運送,交付,2010年1月歸還,然後運送,交付,2010年2月歸還。所有這些都需要訂購。 – Tom 2010-12-06 15:47:48