2016-09-28 50 views
0

我正在使用AdventureWorks2014數據庫並使用以下查詢。根據數據中的年份拆分日期列

select 
SUM(Purchasing.PurchaseOrderDetail.OrderQty) as 'Total Quantity', 
SUM(Purchasing.PurchaseOrderDetail.LineTotal) as 'Total Amount', 
Purchasing.PurchaseOrderHeader.VendorID 

from Purchasing.PurchaseOrderDetail 
inner join Purchasing.PurchaseOrderHeader 
on Purchasing.PurchaseOrderDetail.PurchaseOrderID = Purchasing.PurchaseOrderHeader.PurchaseOrderID 

group by Purchasing.PurchaseOrderHeader.VendorID, DATEPART(year,Purchasing.PurchaseOrderHeader.OrderDate) 
order by Purchasing.PurchaseOrderHeader.VendorID 

這給了我以下輸出。

|------------------------------------| 
|Total Quantity|Total Amount|VendorID| 
|15   |694.1655 | 1492| 
|288   |12370.239 | 1492| 
|45   |1931.7375 | 1492| 
|180   |7682.6295 | 1492| 
|9350   |150404.1 | 1494| 
|1650   |26541.9  | 1494| 
|550   |8847.3  | 1494| 
|16500   |265419  | 1494| 
|------------------------------------| 

據我所知,這是每年的數據,即價值2011,2012,2013和2014年,每個供應商。這就是每個供應商重複4次的原因。

我需要將這些年份中的每一年作爲輸出中的單獨列,如下所示。

|--------------------------------------------------------------------------------| 
|Total Quantity|Total Amount|VendorID|2011Amount|2012Amount|2013Amount|2014Amount| 
|--------------------------------------------------------------------------------| 

有什麼想法?

+0

使用主軸..你可以在網上找到更多關於它的信息 –

+0

@ShakeerMirza謝謝你的提示,我會給它一個鏡頭...... –

+1

@ShakeerMirza,因爲你正在聚合超過1列我實際上會推薦條件聚合。當超過1個色譜柱時,PIVOT可能會更困難。儘管在這種情況下在表中使用窗口函數來創建不同的值,但是使得PIVOT變得輕鬆一些。 – Matt

回答

1

樞軸方法,請確保您首先準備好查詢之前如何旋轉。

;WITH cte AS (
    SELECT 
     DATEPART(year,poh.OrderDate) as [Year] 
     ,SUM(pod.OrderQty) OVER (PARTITION BY DATEPART(year,poh.OrderDate)) as TotalQuantity 
     ,SUM(pod.LineTotal) OVER (PARTITION BY DATEPART(year,poh.OrderDate)) as TotalAmount 
     ,pod.LineTotal as Amount 
    FROM 
     Purchasing.PurchaseOrderDetail pod 
     INNER JOIN Purchasing.PurchaseOrderHeader poh 
     ON pod.PurchaseOrderId = poh.PurchaseOrderId 
) 

SELECT * 
FROm 
    cte 
    PIVOT (
     SUM(Amount) 
     FOR [Year] IN ([2011],[2012],[2013],[2014]) 
    ) p 

條件聚合方法

SELECT 
    SUM(pod.OrderQty) as TotalQuantity 
    ,SUM(pod.LineTotal) as TotalAmount 
    ,SUM(CASE WHEN DATEPART(year,poh.OrderDate) = 2011 THEN pod.LineTotal ELSE 0 END) as [2011Amount] 
    ,SUM(CASE WHEN DATEPART(year,poh.OrderDate) = 2012 THEN pod.LineTotal ELSE 0 END) as [2012Amount] 
    ,SUM(CASE WHEN DATEPART(year,poh.OrderDate) = 2013 THEN pod.LineTotal ELSE 0 END) as [2013Amount] 
    ,SUM(CASE WHEN DATEPART(year,poh.OrderDate) = 2014 THEN pod.LineTotal ELSE 0 END) as [2014Amount] 
FROM 
    Purchasing.PurchaseOrderDetail pod 
    INNER JOIN Purchasing.PurchaseOrderHeader poh 
    ON pod.PurchaseOrderId = poh.PurchaseOrderId 

在這種情況下,我想我會與條件聚合方法去.....請注意,我用表的別名來引用表,而不是繼續輸入長名稱是一個很好的習慣。

這個確切的代碼當然沒有經過測試,因爲您沒有包含測試數據和期望的結果,但技術是這樣做的最標準方法。請注意,當聚合涉及多於1列時,通常最容易進行條件聚合。

相關問題