SQL如何在左上角单元格上透视整个表
在谷歌搜索了一段时间后,我发现我不能使用pivot,因为它在Redshift上不可用,但我想也许这里有一些天才可以帮我解决这个问题 我想让整个结果表以左上角单元格为轴心 现在,我的查询如下所示:SQL如何在左上角单元格上透视整个表,sql,amazon-redshift,Sql,Amazon Redshift,在谷歌搜索了一段时间后,我发现我不能使用pivot,因为它在Redshift上不可用,但我想也许这里有一些天才可以帮我解决这个问题 我想让整个结果表以左上角单元格为轴心 现在,我的查询如下所示: SELECT pid, COUNT(DISTINCT CASE WHEN colA = 'true' THEN id ELSE NULL END) as "cA", COUNT(DISTINCT CASE WHEN colB = 'true' THEN id ELSE NULL END) as "cB"
SELECT pid,
COUNT(DISTINCT CASE WHEN colA = 'true' THEN id ELSE NULL END) as "cA",
COUNT(DISTINCT CASE WHEN colB = 'true' THEN id ELSE NULL END) as "cB",
COUNT(DISTINCT CASE WHEN colC = 'true' THEN id ELSE NULL END) as "cC",
COUNT(DISTINCT CASE WHEN colD = 'true' THEN id ELSE NULL END) as "cD",
FROM Data1.Table1
WHERE date1 >= date(getdate()-7) and pid IS NOT NULL
group by pid
pid r1 r2 r3 r4
cA A1 A2 A3 A4
cB B1 B2 B3 B4
cC C1 C2 C3 C4
cD D1 D2 D3 D4
它给了我这张桌子
pid cA cB cC cD
r1 A1 B1 C1 D1
r2 A2 B2 C2 D2
r3 A3 B3 C3 D3
r4 A4 B4 C4 D4
我如何旋转它,以便得到如下所示的表格:
SELECT pid,
COUNT(DISTINCT CASE WHEN colA = 'true' THEN id ELSE NULL END) as "cA",
COUNT(DISTINCT CASE WHEN colB = 'true' THEN id ELSE NULL END) as "cB",
COUNT(DISTINCT CASE WHEN colC = 'true' THEN id ELSE NULL END) as "cC",
COUNT(DISTINCT CASE WHEN colD = 'true' THEN id ELSE NULL END) as "cD",
FROM Data1.Table1
WHERE date1 >= date(getdate()-7) and pid IS NOT NULL
group by pid
pid r1 r2 r3 r4
cA A1 A2 A3 A4
cB B1 B2 B3 B4
cC C1 C2 C3 C4
cD D1 D2 D3 D4
实际上,原始表的列数比这个示例的多,并且不容易阅读。这就是为什么我想旋转它,使它基本垂直
有可能吗
根据要求,这里是一个数据样本,以及我当前的查询从样本中得到的信息
样品
id date1 pid cA cB cC cD
1000 9/6/2017 r1 true false true false
1001 9/7/2017 r1 false true true true
1001 9/5/2017 r3 true false true false
1002 9/7/2017 r2 true true true false
1003 9/1/2017 r4 false false false true
1004 8/24/2017 r3 true false true false
1002 9/7/2017 r2 false false true false
查询结果
pid cA cB cC cD
r1 1 1 2 1
r2 1 1 2 1
r3 2 0 2 0
r4 0 0 0 0
想要的结果
pid r1 r2 r3 r4
cA 1 1 2 0
cB 1 1 0 0
cC 2 2 2 0
cD 1 1 0 0
试试这个:
我在这里使用了纯枢轴转换:
CREATE TABLE temp_table ( ids INT,A NVARCHAR(5),B NVARCHAR(5),C NVARCHAR(5),D NVARCHAR(5))
INSERT INTO temp_table VALUES (1,'A1','B1','C1','D1'), (2,'A2','B2','C2','D2'), (3,'A3','B3','C3','D3'),(4,'A4','B4','C4','D4'),(5,'A5','B5','C5','D5')
SELECT * FROM temp_table
DECLARE @temp_table_columns TABLE (id INT,col NVARCHAR(20))
DECLARE @result_val TABLE(id INT,value NVARCHAR(max))
INSERT INTO @temp_table_columns SELECT ORDINAL_POSITION id,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'temp_table'
DECLARE @initial_value NVARCHAR(MAX)='',@starter INT = (SELECT MAX(id) FROM @temp_table_columns),@initial INT = 0
WHILE(@initial<@starter)
BEGIN
DECLARE @rower NVARCHAR(20) = (SELECT col FROM @temp_table_columns WHERE id=@initial+1)
INSERT INTO @result_val EXEC ('SELECT '''+@initial+''', '+@rower+' FROM temp_table')
SET @initial_value = @initial_value +
' UNION SELECT '+CONVERT(NVARCHAR,@initial)+' [id],'''+@rower+''' '+@rower +(SELECT ', '''+value+''' ['+value+']'
FROM @result_val WHERE id=@initial FOR XML PATH(''))
SET @initial=@initial+1
END
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='temp_table') DROP TABLE temp_table
SET @initial_value = 'SELECT * INTO temp_table FROM (' + SUBSTRING(@initial_value,8,LEN(@initial_value)) + ' ) A WHERE id<>0'
EXEC (@initial_value)
ALTER TABLE temp_table DROP COLUMN [id]
SELECT * FROM temp_table
您可以相应地修改它: 您可以使用UNION ALL以您想要的方式旋转它
select 'cA' as pid
, count(distinct case when ca is true and pid = 'r1' then id else null end) as r1
, count(distinct case when ca is true and pid = 'r2' then id else null end) as r2
, count(distinct case when ca is true and pid = 'r3' then id else null end) as r3
, count(distinct case when ca is true and pid = 'r4' then id else null end) as r4
from table1
group by 1
union all
select 'cB' as pid
, count(distinct case when cb is true and pid = 'r1' then id else null end) as r1
, count(distinct case when cb is true and pid = 'r2' then id else null end) as r2
, count(distinct case when cb is true and pid = 'r3' then id else null end) as r3
, count(distinct case when cb is true and pid = 'r4' then id else null end) as r4
from table1
group by 1
union all
select 'cC' as pid
, count(distinct case when cc is true and pid = 'r1' then id else null end) as r1
, count(distinct case when cc is true and pid = 'r2' then id else null end) as r2
, count(distinct case when cc is true and pid = 'r3' then id else null end) as r3
, count(distinct case when cc is true and pid = 'r4' then id else null end) as r4
from table1
group by 1
union all
select 'cD' as pid
, count(distinct case when cd is true and pid = 'r1' then id else null end) as r1
, count(distinct case when cd is true and pid = 'r2' then id else null end) as r2
, count(distinct case when cd is true and pid = 'r3' then id else null end) as r3
, count(distinct case when cd is true and pid = 'r4' then id else null end) as r4
from table1
group by 1
order by 1
如有必要,可以随意添加WHERE子句
请记住,如果有更多的PID r5、r6等,则需要手动添加它们。这不是很有效,但我认为红移中没有其他方法。您的解决方案似乎会添加值A1、A2、A3。。。我的查询从表中获取数据的表。我错了吗?如果我错了,我在第一次插入时遇到错误无效操作:插入位置或附近出现语法错误:99此脚本使用T-SQL for SQL Server-它在Amazon Redshift上不起作用。您可以发布表中的样本数据吗?我无法发布数据的实际样本,因为它是敏感的,但我制作了一个适合数据和我从数据中获得的正确样本使用我当前的查询。它起作用了,但Group by正在添加多余的行,因此我将其删除,并且我没有使用Order by,因为每次选择都已给出顺序