2017-10-17 79 views
1

這是一個腦筋急轉彎,我無法解決它。 我有一個表,其中的數據是這樣的:選擇頭12個月的數據

Year January February March April May June July August September October November December 
2017 NULL NULL NULL NULL NULL NULL 2259.30 1998.72 1790.73 1612.39 1445.99 1275.14 
2018 1148.13 997.40 917.40 839.07 778.41 714.67 643.40 590.50 551.88 501.99 445.25 385.54 
2019 354.34 315.85 295.80 271.16 252.00 231.18 208.58 190.06 172.44 155.82 138.32 118.72 
2020 105.94 87.16 74.55 63.07 50.96 39.12 27.77 23.82 22.38 18.73 12.93 8.15 
2021 7.76 6.97 6.82 6.35 6.38 6.39 6.42 6.41 6.38 6.37 5.62 5.70 
2022 5.37 4.73 4.60 4.33 4.31 4.40 4.31 4.31 4.35 4.33 4.30 4.40 
2023 4.14 3.75 3.66 3.48 3.42 3.50 3.47 3.42 3.50 3.47 3.42 3.50 
2024 3.25 2.88 2.80 2.61 2.62 2.57 2.59 2.61 2.62 2.57 2.59 2.61 
2025 2.50 2.23 2.23 2.16 2.13 2.20 2.16 2.18 2.18 2.15 2.14 2.22 
2026 2.10 1.86 1.85 1.74 1.73 1.74 1.74 1.67 1.77 1.74 1.73 1.74 
2027 1.62 1.40 1.40 1.32 1.34 1.24 1.29 1.27 1.37 1.26 1.30 1.30 
2028 1.09 0.49 0.30 0.01 NULL NULL NULL NULL NULL NULL NULL NULL 

我想這個觀點一分爲二。想要選擇前12個月,在這種情況下,2017年7月到2018年6月,並以相同的方式顯示它(當前日曆視圖)。第2部分:我想選擇其餘的數據(前12個月除外),並以相同的方式顯示。還有另一張桌子的分佈要短得多。我的意思是,目前的例子有10年以上,另一個是4年。我想要在兩個表上應用分配查詢。

謝謝。

預期輸出1

Year January February March April May June July August September October November December 
2017 NULL NULL NULL NULL NULL NULL 2259.30 1998.72 1790.73 1612.39 1445.99 1275.14 
2018 1148.13 997.40 917.40 839.07 778.41 714.67 NULL NULL NULL NULL NULL NULL 

輸出2:

Year January February March April May June July August September October November December 
2018 NULL NULL NULL NULL NULL NULL 643.40 590.50 551.88 501.99 445.25 385.54 
2019 354.34 315.85 295.80 271.16 252.00 231.18 208.58 190.06 172.44 155.82 138.32 118.72 
2020 105.94 87.16 74.55 63.07 50.96 39.12 27.77 23.82 22.38 18.73 12.93 8.15 
2021 7.76 6.97 6.82 6.35 6.38 6.39 6.42 6.41 6.38 6.37 5.62 5.70 
2022 5.37 4.73 4.60 4.33 4.31 4.40 4.31 4.31 4.35 4.33 4.30 4.40 
2023 4.14 3.75 3.66 3.48 3.42 3.50 3.47 3.42 3.50 3.47 3.42 3.50 
2024 3.25 2.88 2.80 2.61 2.62 2.57 2.59 2.61 2.62 2.57 2.59 2.61 
2025 2.50 2.23 2.23 2.16 2.13 2.20 2.16 2.18 2.18 2.15 2.14 2.22 
2026 2.10 1.86 1.85 1.74 1.73 1.74 1.74 1.67 1.77 1.74 1.73 1.74 
2027 1.62 1.40 1.40 1.32 1.34 1.24 1.29 1.27 1.37 1.26 1.30 1.30 
2028 1.09 0.49 0.30 0.01 NULL NULL NULL NULL NULL NULL NULL NULL  
+0

您的數據庫有一個日曆(https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/)表? – pimbrouwers

+0

請添加您的預期輸出,通過文本很難理解您想要什麼。 –

回答

1

另一種選擇是逆轉置有針對性的子集,然後轉動

;with cte as (
     Select A.Year 
       ,Mnth = DateName(MONTH,B.Per) 
       ,B.Per 
       ,B.Value 
     From YourTable A 
     Cross Apply (values (1 ,cast(str(Year)+'-01-01' as date),[January]) 
          ,(2 ,cast(str(Year)+'-02-01' as date),[February]) 
          ,(3 ,cast(str(Year)+'-03-01' as date),[March]) 
          ,(4 ,cast(str(Year)+'-04-01' as date),[April]) 
          ,(5 ,cast(str(Year)+'-05-01' as date),[May]) 
          ,(6 ,cast(str(Year)+'-06-01' as date),[June]) 
          ,(7 ,cast(str(Year)+'-07-01' as date),[July]) 
          ,(8 ,cast(str(Year)+'-08-01' as date),[August]) 
          ,(9 ,cast(str(Year)+'-09-01' as date),[September]) 
          ,(10,cast(str(Year)+'-10-01' as date),[October]) 
          ,(11,cast(str(Year)+'-11-01' as date),[November]) 
          ,(12,cast(str(Year)+'-12-01' as date),[December]) 
        ) B (Mnth,Per,Value) 
) , cte2 as (Select FirstPer = max(Per) from cte where Value is null and Year=(Select min(Year) from cte)) 
Select * 
From (
     Select OutPut = case when Per > DateAdd(MONTH,12,FirstPer) then 2 else 1 end 
       ,Year,Mnth,Value 
     From cte 
     Cross Join cte2 
    ) A 
Pivot (sum([Value]) For [Mnth] in ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])) p 

退貨

enter image description here

+0

John,不能編譯,因爲datefromparts在我的2008 sql server上不可用! – Eclipse

+0

@Eclipse有一刻。我將編輯2008年 –

+0

此外,是否有可能捕捉範圍動態數據將每月移動,我只想捕獲前12個月沒有提供查詢日期?前12個月,數據不爲空。 – Eclipse

0

對於第1部分你在找這樣的查詢?

Select 
case when Year = 2017 then null else January end as January, 
case when Year = 2017 then null else February end as February, 
case when Year = 2017 then null else March end as March, 
case when Year = 2017 then null else April end as April, 
case when Year = 2017 then null else May end as May, 
case when Year = 2017 then null else June end as June, 
case when Year = 2018 then null else July end as July, 
case when Year = 2018 then null else August end as August, 
case when Year = 2018 then null else September end as September, 
case when Year = 2018 then null else October end as October, 
case when Year = 2018 then null else November end as November, 
case when Year = 2018 then null else December end as December 
from mytable 
Where Year in (2017, 2018) 

不是最好的解決辦法可能是,但仍然可以完成這項工作...