2013-06-26 56 views
2

我有產生類似結果的表:樞軸沒有在SQL Server上的數字字段總

Code Month Value 

733  May  520.00 
733  May  2250.00 
733  May  125.00 

我有一個要求,我需要這樣的顯示上面記載:

Code May 
733  520 
733  2250 
733  125 

我可以去爲支點想到一個辦法,所以我要去這樣的:

Select 
    Code, 
    IsNull(January,0)[January(Actual)],   
    IsNull(February,0)[February(Actual)],    
    IsNull(March,0)[March(Actual)],    
    IsNull(April,0)[April(Actual)],    
    IsNull(May,0)[May(Actual)],    
    IsNull(June,0)[June(Actual)],    
    IsNull(July,0)[July(Actual)],    
    IsNull(August,0)[August(Actual)],    
    IsNull(September,0)[September(Actual)],    
    IsNull(October,0)[October(Actual)],    
    IsNull(November,0)[November(Actual)],    
    IsNull(December,0)[December(Actual)] 
From 
    (
    Select 
     Code, 
     [Month], 
     Value 
    From 
     #tempMonthWiseActualValue 
    )s 
Pivot 
    (
     min([Value]) 
     For [Month]   
     In (January,February,March,April,May,June,July,August,September,October,November,December) 
    )as pvt 
Order by Code 

但是有一個限制,因爲我需要保留所有的值,所以沒有聚合函數可以在這裏工作,即沒有MIN,MAX,SUM等。使用Min/Max會給我125或2250的值列。

所以我的問題是:

有沒有一種方法,通過它我可以找到使用數據透視表或我應該去#TEMP表期望的結果?

+0

假設你在5月份有2行,在4月份有2個是相同的代碼:'1,May,10'; '1,五月,20'; '1,四月,30'; '1,四月,40'。計算機應該如何告訴你想要的輸出應該是:'1月5日,30日爲4月'或'1月5日,40日爲4月'? – Stoleg

+0

當其他月份有值時會發生什麼?或更多的同一個月?你是否爲每個原始條目創建一個新行? –

+0

由於月份的值與代碼相關,因此它們在結果中的顯示方式無關緊要。最後的結果可能是1月10日,5月30日,4月或1月5日,4月4日, – sdeep

回答

0

我知道這是一個非常狹窄的解決方法。它有助於避免將數據放在不同月份的同一行上的問題。 如果您描述ovarall任務,那麼我可以建議更好的解決方案。

Select 
    Code as Code 
    Value as May 
from Table 
where Month = 'May' 
+0

感謝您的查詢我發現它的工作,但又一個問題。我們如何將它擴展多個月?在這種情況下,我認爲我需要使用select case語句嗎? – sdeep

+0

11'OUTER JOIN's - 如果你這樣做。這就是爲什麼我們需要更多關於整體任務的信息。 – Stoleg

0

在我的情況下使用ROW_NUMBER(中)將允許以獲得所需的輸出,它也將處理即使有多個月零一個月有更多的價值比其他。希望它可以幫助別人面臨類似的情況:

Select 
    Code, 
    rnum, 
    IsNull(January,0)[January(Value)],   
    IsNull(February,0)[February(Value)],    
    IsNull(March,0)[March(Value)],    
    IsNull(April,0)[April(Value)],    
    IsNull(May,0)[May(Value)],    
    IsNull(June,0)[June(Value)],    
    IsNull(July,0)[July(Value)],    
    IsNull(August,0)[August(Value)],    
    IsNull(September,0)[September(Value)],    
    IsNull(October,0)[October(Value)],    
    IsNull(November,0)[November(Value)],    
    IsNull(December,0)[December(Value)] 

From 
    (
    Select 
     Code, 
     ROW_NUMBER() Over (Order by nSRNo) [rnum], 
     [Month], 
     Value 
    From 
     #tempMonthWiseActualValue 
    )s 
Pivot 
    (
    Max([Value]) 
    For [Month]   
    In (January,February,March,April,May,June,July,August,September,October,November,December) 
)as pvt 
0

有兩種方法來實現這個

首先,使用簡單的情況下:)

SELECT 
Code AS Code, 
CASE WHEN Month = 'January' THEN Value ELSE 0 END AS January , 
CASE WHEN Month = 'February' THEN Value ELSE 0 END AS February , 
CASE WHEN Month = 'March' THEN Value ELSE 0 END AS March , 
CASE WHEN Month = 'April' THEN Value ELSE 0 END AS April , 
CASE WHEN Month = 'May' THEN Value ELSE 0 END AS May , 
CASE WHEN Month = 'June' THEN Value ELSE 0 END AS June , 
CASE WHEN Month = 'July' THEN Value ELSE 0 END AS July , 
CASE WHEN Month = 'August' THEN Value ELSE 0 END AS August , 
CASE WHEN Month = 'September' THEN Value ELSE 0 END AS September , 
CASE WHEN Month = 'October' THEN Value ELSE 0 END AS October , 
CASE WHEN Month = 'November' THEN Value ELSE 0 END AS November, 
CASE WHEN Month = 'December' THEN Value ELSE 0 END AS December 
FROM CodePivot1 

其次,使用透視和ROWNUM

SELECT Code, 
ISNULL(January,0) AS January, 
ISNULL(February,0) AS February, 
ISNULL(March,0) AS March, 
ISNULL(April,0) AS April, 
ISNULL(May,0) AS May, 
ISNULL(June,0) AS June, 
ISNULL(July,0) AS July, 
ISNULL(August,0) AS August, 
ISNULL(September,0) AS September, 
ISNULL(October,0) AS October, 
ISNULL(November,0) AS November, 
ISNULL(December,0) AS December 
FROM 
    (
    SELECT 
     Code, [Month], Value, ROW_NUMBER() OVER (ORDER BY Code) [rnum] 
    FROM 
     CodePivot1 
    )s 
PIVOT 
    (
    MAX([Value]) 
    FOR [Month]   
    IN (January,February,March,April,May,June,July,August,September,October,November,December) 
)as p