Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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中的like构造_Sql_Pivot_Case - Fatal编程技术网

创建一个;“数据透视表”;sql中的like构造

创建一个;“数据透视表”;sql中的like构造,sql,pivot,case,Sql,Pivot,Case,这将有点复杂,但我有一个名为dbo.sizeclassreport的表。如果这有点含糊,我道歉 它有78656行/记录,但并不那么庞大。有三个显著的领域;就业、面积和规模类别。下面是示例数据 Area Employment sizeclass 000003 4 01 000001 6 02 000013 12 03 000003 2

这将有点复杂,但我有一个名为dbo.sizeclassreport的表。如果这有点含糊,我道歉

它有78656行/记录,但并不那么庞大。有三个显著的领域;就业、面积和规模类别。下面是示例数据

Area     Employment    sizeclass
000003       4              01
000001       6              02
000013      12              03
000003       2              01
000005      23              04
000001       7              02
000003      11              03
从这里看,结果是这样的。共有9个级别和18个区域。需要对每个区域进行9次细分。每个区域将按大小分类

Area        Sizeclass     Employment in Size Class    Number of Sites
Total           00                17(6+11)                    3
000003          01                6 (4+2)                     2 
000003          02              NULL or Empty             NULL or Empty
000003          03                    11                      1
......
000003          09              NULL or Empty             NULL or Empty

看起来您希望输出中包含所有
区域
s和
大小类
s。如果是,请使用
交叉连接
生成结果,然后使用
左连接
分组方式
进行计算:

select a.area, sc.sizeclass,
       sum(scr.employment) as employment,
       count(scr.area) as number_of_sizes
from (select distinct area from dbo.sizeclassreport scr) a cross join
     (select distinct sizeclass from dbo.sizeclassreport scr) sc left join
     dbo.sizeclassreport scr
     on a.area = scr.area and sc.sizeclass = scr.sizeclass
group by a.area, sc.sizeclass;

注意:这将返回最后一列的
0
,而不是
NULL
。这对我来说更有意义。但是,如果您确实需要一个
NULL
值,可以使用
NULLIF()

看起来您需要输出中的所有
区域和
大小类。如果是,请使用
交叉连接
生成结果,然后使用
左连接
分组方式
进行计算:

select a.area, sc.sizeclass,
       sum(scr.employment) as employment,
       count(scr.area) as number_of_sizes
from (select distinct area from dbo.sizeclassreport scr) a cross join
     (select distinct sizeclass from dbo.sizeclassreport scr) sc left join
     dbo.sizeclassreport scr
     on a.area = scr.area and sc.sizeclass = scr.sizeclass
group by a.area, sc.sizeclass;
SELECT 
    [Areas].[Area], 
    [classSizes].[sizeclass],
    SUM([data].[Employment]) AS [Employment in Size Class],
    /*this would be better with your PK */
    CASE COUNT([data].[Employment])
        WHEN 0 THEN NULL
        ELSE COUNT([data].[Employment])
        END  AS [Number of Sites]

/*These rows create your base matix*/
FROM (SELECT DISTINCT 
        [Area] 
    FROM [sizeclassreport]) AS [Areas] 
CROSS JOIN (SELECT DISTINCT 
                [sizeclass] 
            FROM [sizeclassreport]) AS [classSizes] 

/* this is where you select your data*/
LEFT OUTER JOIN [sizeclassreport] [data]
     ON [Areas].[Area] = [data].[Area] 
        AND [classSizes].[sizeclass] = [data].[sizeclass]
GROUP BY
    [areas].[Area], 
    [classSizes].[sizeclass]
ORDER BY
    [areas].[Area], 
    [classSizes].[sizeclass]

注意:这将返回最后一列的
0
,而不是
NULL
。这对我来说更有意义。但是,如果您确实需要
NULL
值,可以使用
NULLIF()

请使用您正在使用的数据库进行标记。好的,我将通过对组进行研究。这会改变我的sizeclassreport表还是它是一个单独的实体?请用您正在使用的数据库标记。好的,我将按搜索组。这会改变我的sizeclassreport表还是它是一个单独的实体?现在运行该查询。运行时间是否应该超过10分钟?如果有大量数据,交叉连接将很慢。在我等待时,a.area和sc.sizeclass背后的原因是什么?这样我下次就可以构造自己的了。它成功地执行了,但给出了错误的值。让我想一想,现在就开始查询。运行时间是否应该超过10分钟?如果有大量数据,交叉连接将很慢。在我等待时,a.area和sc.sizeclass背后的原因是什么?这样我下次就可以构造自己的了。它成功地执行了,但给出了错误的值。让我想一想,这很有效。谢谢。我一行一行地把它分解,努力让自己更熟练。这很有效。谢谢。我正在一行一行地分解这一点,以努力变得更加熟练。
SELECT 
    [Areas].[Area], 
    [classSizes].[sizeclass],
    SUM([data].[Employment]) AS [Employment in Size Class],
    /*this would be better with your PK */
    CASE COUNT([data].[Employment])
        WHEN 0 THEN NULL
        ELSE COUNT([data].[Employment])
        END  AS [Number of Sites]

/*These rows create your base matix*/
FROM (SELECT DISTINCT 
        [Area] 
    FROM [sizeclassreport]) AS [Areas] 
CROSS JOIN (SELECT DISTINCT 
                [sizeclass] 
            FROM [sizeclassreport]) AS [classSizes] 

/* this is where you select your data*/
LEFT OUTER JOIN [sizeclassreport] [data]
     ON [Areas].[Area] = [data].[Area] 
        AND [classSizes].[sizeclass] = [data].[sizeclass]
GROUP BY
    [areas].[Area], 
    [classSizes].[sizeclass]
ORDER BY
    [areas].[Area], 
    [classSizes].[sizeclass]