2013-04-05 32 views
-2

我正在尋找樞紐這個數據,所以輸出可以計算每個年齡段有多少人...有人可以爲我分解一個PIVOT查詢嗎?

以下是我所做的,但我甚至不認爲我接近... 。

我使用SQL Server 2008

SELECT  [OA_Code], Dominant_F_Age, Age_F_90plus, Age_F_85_89, Age_F_80_84, Age_F_75_79, Age_F_70_74, Age_F_65_69, Age_F_60_64, 
         Age_F_55_59, Age_F_50_54, Age_F_45_49, Age_F_40_44, Age_F_35_39, Age_F_30_34, Age_F_25_29, Age_F_20_24, Age_F_15_19, Age_F_10_14, Age_F_5_9, 
         Age_F_0_4, Age_2001_F 
FROM   cen.AgeByGenderOA 
PIVOT (
    f_Age_data 
    for [F_Age_Data] in (Age_F_90plus, Age_F_85_89, Age_F_80_84, Age_F_75_79, Age_F_70_74, Age_F_65_69, Age_F_60_64, 
         Age_F_55_59, Age_F_50_54, Age_F_45_49, Age_F_40_44, Age_F_35_39, Age_F_30_34, Age_F_25_29, Age_F_20_24, Age_F_15_19, Age_F_10_14, Age_F_5_9), 
         Age_F_0_4) 

我的表看起來像這樣:

CREATE TABLE AgeByGenderOA(
      [OA_Code] AS VARCHAR(50), 
      [Age_M_0_4] [varchar](50) NULL, 
     [Age_M_5_9] [varchar](50) NULL, 
     [Age_M_10_14] [varchar](50) NULL, 
     [Age_M_15_19] [varchar](50) NULL, 
     [Age_M_20_24] [varchar](50) NULL, 
     [Age_M_25_29] [varchar](50) NULL, 
     [Age_M_30_34] [varchar](50) NULL, 
     [Age_M_35_39] [varchar](50) NULL, 
     [Age_M_40_44] [varchar](50) NULL, 
     [Age_M_45_49] [varchar](50) NULL, 
     [Age_M_50_54] [varchar](50) NULL, 
     [Age_M_55_59] [varchar](50) NULL, 
     [Age_M_60_64] [varchar](50) NULL, 
     [Age_M_65_69] [varchar](50) NULL, 
     [Age_M_70_74] [varchar](50) NULL, 
     [Age_M_75_79] [varchar](50) NULL, 
     [Age_M_80_84] [varchar](50) NULL, 
     [Age_M_85_89] [varchar](50) NULL, 
     [Age_M_90plus] [varchar](50) NULL, 
     [Dominant_M_Age] [varchar](50) NULL, 
     [Age_2001_F] [varchar](50) NULL, 
     [Age_F_0_4] [varchar](50) NULL, 
     [Age_F_5_9] [varchar](50) NULL, 
     [Age_F_10_14] [varchar](50) NULL, 
     [Age_F_15_19] [varchar](50) NULL, 
     [Age_F_20_24] [varchar](50) NULL, 
     [Age_F_25_29] [varchar](50) NULL, 
     [Age_F_30_34] [varchar](50) NULL, 
     [Age_F_35_39] [varchar](50) NULL, 
     [Age_F_40_44] [varchar](50) NULL, 
     [Age_F_45_49] [varchar](50) NULL, 
     [Age_F_50_54] [varchar](50) NULL, 
     [Age_F_55_59] [varchar](50) NULL, 
     [Age_F_60_64] [varchar](50) NULL, 
     [Age_F_65_69] [varchar](50) NULL, 
     [Age_F_70_74] [varchar](50) NULL, 
     [Age_F_75_79] [varchar](50) NULL, 
     [Age_F_80_84] [varchar](50) NULL, 
     [Age_F_85_89] [varchar](50) NULL, 
     [Age_F_90plus] [varchar](50) NULL, 
     [Dominant_F_Age] [varchar](50) NULL, 
     [MAPINFO_ID] [varchar](50) NULL) 

正如你可以看到它是一個巨大的表。 「Age_M_0_4」列填充了數字。

,我想我的輸出讀

OA_Code, Age, countOfAge 
123456, Age_0_4, 26 
123456, Age_5_9, 24 
789456, Age_0_4, 10 
789456, Age_5_9, 12 

這將是包容性的男性和女性的青睞。

任何人都喜歡在這一個裂縫?

最後:包含在「Age_M_」列中的數據都是數字計數。 50,40,2,0等...

+0

您已經通過具有這樣的嚴重非規範化表使它難爲了自己。你真的需要一個只有3列'OA_Code','Age'(或者'age_range',你可以鏈接到另一個表來定義你的範圍,但最好你會在你的表中存儲實際數據而不是彙總數據),最後是一個表「性別」列。然後,所有的查詢變得更容易。 – Brad 2013-04-05 16:00:47

回答

4

你不想要一個PIVOT,你需要UNPIVOT數據。由於您使用的是SQL Server 2008+,因此可以使用CROSS APPLYVALUES子句。該代碼將與此類似:

select t.OA_Code, 
    c.age, 
    sum(cast(c.value as int)) countOfAge 
from AgeByGenderOA t 
cross apply 
(
    values 
    ('Age_0_4', Age_M_0_4), 
    ('Age_5_9', Age_M_5_9), 
    ('Age_10_14', Age_M_10_14), 
    ('Age_15_19', Age_M_15_19) ... add the other columns here 
) c (age, value) 
group by t.OA_Code, c.age 

SQL Fiddle with Demo

編輯,如果你想同時男/女列,你將包括所有的值子句中的列,而是給他們同樣的年齡範圍值:

select t.OA_Code, 
    c.age, 
    sum(cast(c.value as int)) countOfAge 
from AgeByGenderOA t 
cross apply 
(
    values 
    ('Age_0_4', Age_M_0_4), 
    ('Age_5_9', Age_M_5_9), 
    ('Age_10_14', Age_M_10_14), 
    ('Age_15_19', Age_M_15_19), 
    ('Age_0_4', Age_F_0_4), 
    ('Age_5_9', Age_F_5_9), 
    ('Age_10_14', Age_F_10_14), 
    ('Age_15_19', Age_F_15_19) 
) c (age, value) 
group by t.OA_Code, c.age; 

SQL Fiddle with Demo

+0

我不認爲這是正確的。我的輸出示例中的「Age」應該由腳本生成。也許我提供的信息不夠好。我會盡力使它更清楚。 – Waller 2013-04-05 15:41:37

+0

@Waller你能提供一些樣本數據嗎?或者用你的一些實際數據編輯SQL小提琴? http://www.sqlfiddle.com/#!3/ded85/2 – Taryn 2013-04-05 15:42:28

+0

http://www.sqlfiddle.com/#!3/343f2/1/0試試這個 – Waller 2013-04-05 15:47:44

相關問題