创建一个;“数据透视表”;sql中的like构造
这将有点复杂,但我有一个名为dbo.sizeclassreport的表。如果这有点含糊,我道歉 它有78656行/记录,但并不那么庞大。有三个显著的领域;就业、面积和规模类别。下面是示例数据创建一个;“数据透视表”;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
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]