sql - 在 SQL 中将多行合并为具有单独列的单行

标签 sql sql-server pivot

我有以下表结构,下面列出了预期输出以及如何实现结果

id -  date -   score 
1  - 2013/04/13 - 100
2  - 2013/04/14 - 92 
3  - 2013/04/15 - 33 

预期输出:

date -2013-04-13 - 2013-04-14 -  2013-04-15 
score -  100      -   92        -    33

最佳答案

使用PIVOT表运算符:

SELECT *
FROM (SELECT date, score FROM tablename) AS t
PIVOT
(
  MAX(Score)
  FOR date IN([2013-04-13], [2013-04-14], [2013-04-15])
) AS p;

在这里查看它的实际效果:

这会给你:

| 2013-04-13 | 2013-04-14 | 2013-04-15 |
----------------------------------------
|        100 |         92 |         33 |

如果您想动态执行此操作,则必须使用动态 sql 来执行此操作。像这样的事情:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);


select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(date)
                      FROM tablename
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SET @query = 'SELECT *
              FROM (SELECT date, score FROM tablename) AS t
              PIVOT
              (
                MAX(Score)
                FOR date IN( ' + @cols+ ' )
              ) AS p;';


EXECUTE(@query);

在这里查看它的实际效果:

请注意:我假设您的表中有唯一的日期条目,在这种情况下,MAX(score) 将正常工作,以防有更多您可以使用 SUM 代替同一天的日期条目。但是,您必须将任何聚合函数与 PIVOT 表运算符一起使用。

关于sql - 在 SQL 中将多行合并为具有单独列的单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16556896/

相关文章:

jquery - Sql 加入 Codeigniter 吗?

sql - 如果未找到行,QueryRow().Scan() 将返回错误。怎么解决?

mysql - 连接具有不同行和多个 select 语句的两个表

sql - Oracle SQL (Oracle 11g) 中的排名优于分区依据

sql-server - 在 sql 脚本中使用系统环境变量

c - 如何通过 native ODBC 绑定(bind)数组参数(存储过程)

sql - 加入破坏了选择

sql - postgres中具有多个值列的数据透视表

excel - 在 Excel 2010 中,如何显示多个时间范围内特定日期的出现次数?

mysql - 在 MySQL 中按国家/地区的名称分组