Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有人能帮我分解一下PIVOT查询吗?_Sql_Sql Server - Fatal编程技术网

Sql 有人能帮我分解一下PIVOT查询吗?

Sql 有人能帮我分解一下PIVOT查询吗?,sql,sql-server,Sql,Sql Server,我正在寻找这些数据的轴心,以便输出可以计算出每个年龄段有多少人 下面是我所做的,但我甚至不认为我很接近 我正在使用SQLServer2008 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,

我正在寻找这些数据的轴心,以便输出可以计算出每个年龄段有多少人

下面是我所做的,但我甚至不认为我很接近

我正在使用SQLServer2008

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)
正如你所看到的,这是一张巨大的桌子。“年龄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
这将包括男性和女性年龄

有人想试试这个吗


最后:“年龄”列中包含的数据是所有数字计数。50、40、2、0等等。

如果不需要透视,则需要取消透视数据。由于您使用的是SQL Server 2008+,因此可以将
交叉应用
子句一起使用。代码与此类似:

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

编辑,如果您想要两个男性/女性列,您将在values子句中包括所有列,但给它们相同的年龄范围值:

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;

我认为这是不对的。输出示例中的“Age”应该由脚本生成。也许我提供的信息不够好。我会尽量弄清楚的。@Waller你能提供一些样本数据吗?或者用一些实际数据编辑SQL@沃勒:你希望结果是什么?我已经编辑了我的原始提交。可能还不太清楚,但我希望实现的是将“m”和“F”年龄分组,得到一个总数(这些年龄列中的数字)。@Waller这是正确的,您必须扩展
VALUES
子句以包括所有列。我的答案中没有包括所有列,因为您大约有50列。您拥有这样一个高度非规范化的表给自己带来了困难。您真的需要一个只有3列
OA_code
Age
(或者
Age_range
,您可以链接到定义范围的另一个表,但最好是将实际数据存储在表中,而不是汇总数据),最后是
gender
列。这样,所有查询都会变得容易得多。