简体   繁体   English

没有聚合的行到列

[英]Rows to Columns without aggregation

Original table:原表:

+--------------+-----------+-----------------------+
| Key          | Field     |  Value                |
+--------------+-----------+-----------------------+
| Foo          | A         |  1                    |
| Foo          | B         |  2                    |
| Foo          | C         |  null                 |
| Foo          | D         |  bar                  |
+--------------+-----------+-----------------------+

Result should be:结果应该是:

+--------------+---+---+------+-----+
| Key          | A | B | C    | D   |
+--------------+---+---+------+-----+
| Foo          | 1 | 2 | null | bar |
+--------------+---+---+------+-----+

What I've tried:我试过的:

SELECT 
    [Key] AS Id,
    CASE WHEN Field = 'A' THEN Value END AS ACol,
    CASE WHEN Field = 'B' THEN Value END AS BCol,
    CASE WHEN Field = 'C' THEN Value END AS CCol,
    CASE WHEN Field = 'D' THEN Value END AS DCol
FROM MyTable
GROUP BY [Key]

I'm getting我越来越

Column 'Field' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Column 'Value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Any ideas why?任何想法为什么?

You need to take the max of the CASE expressions:您需要取CASE表达式的最大值:

SELECT 
    [Key] AS Id,
    MAX(CASE WHEN Field = 'A' THEN Value END) AS ACol,
    MAX(CASE WHEN Field = 'B' THEN Value END) AS BCol,
    MAX(CASE WHEN Field = 'C' THEN Value END) AS CCol,
    MAX(CASE WHEN Field = 'D' THEN Value END) AS DCol
FROM MyTable
GROUP BY [Key];

Assuming T-SQL and sql Server 2019, here is a solution for dynamic pivot as well.假设 T-SQL 和 sql Server 2019, 这里也是动态 pivot 的解决方案。

create table random (keys VARCHAR(20), field VARCHAR(20), value VARCHAR(20));

insert into random values ('foo', 'A', '1');
insert into random values ('loo', 'Z', '2');
insert into random values ('foo', 'C', null);
insert into random values ('shi', 'D', 'bar');
insert into random values ('mashi', 'E', 'bla');
insert into random values ('urshi', 'F', 'blue');

declare @cols AS NVARCHAR(MAX),  @query  AS NVARCHAR(MAX);
   

select * from random
set @cols= stuff((select distinct (','+quotename(field)) from random for xml path(''), type).value('.','NVARCHAR(MAX)'),1,1,'');
set @query = 'select keys,'+@cols+' from random pivot(max(value) for field in('+@cols+')) as pivottbl';

execute(@query);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM