sql - 简单的数据透视

标签 sql sql-server pivot

我有一个查询(从 MyTable 选择 [类型]、a、b、c、d、e)返回:

[type], [a], [b], [c], [d], [e]
type 1,  x ,  x ,  x ,  x ,  x
type 2,  x ,  x ,  x ,  x ,  x
type 3,  x ,  x ,  x ,  x ,  x

我想旋转数据,使其显示为:

[]     , [type 1], [type 2], [type 3] 
[a]    , x       , x       , x
[b]    , x       , x       , x
[c]    , x       , x       , x
[d]    , x       , x       , x 
[e]    , x       , x       , x   

如有任何有关 SQL 的指示,我们将不胜感激。

最佳答案

我们需要的是:

SELECT  Col, [type 1], [type 2], [type 3]
FROM    (SELECT [type], Amount, Col
         FROM   (SELECT [type], [a], [b], [c], [d], [e]
                FROM    _MyTable) as sq_source
                UNPIVOT (Amount FOR Col IN ([a], [b], [c], [d], [e])) as sq_up) as sq 
PIVOT (MIN(Amount) FOR [type] IN ([type 1], [type 2], [type 3])) as p;

但是由于types的数量是不确定的,我们必须动态地做

DECLARE @cols NVARCHAR(2000)
SELECT  @cols = COALESCE(@cols + ',[' + [type] + ']',
                         '[' + [type] + ']')
FROM    _MyTable
ORDER BY [type]

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT   Col, ' + @cols + '
FROM    (SELECT [type], Amount, Col
         FROM   (SELECT [type], [a], [b], [c], [d], [e]
                FROM    _MyTable) as sq_source
                UNPIVOT (Amount FOR Col IN ([a], [b], [c], [d], [e])) as sq_up) as sq 
PIVOT (MIN(Amount) FOR [type] IN (' + @cols + ')) as p;';

EXECUTE(@query)

但是要小心,因为这个查询在技术上是一个注入(inject)向量。

关于sql - 简单的数据透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672799/

相关文章:

sql - Oracle SQL 使用动态列名转置

sql-server - 有什么办法可以避免子查询吗?

像 PEPSI 这样的 SQL SERVER PIVOT 按年划分,然后按月份划分等。(请参阅附图以获得清晰的想法)

php - 两个外键,如何用 laravel eloquent 映射

Mysql从具有三个条件之一的组中选择一条记录

java - 无法使用jdbc以Windows身份验证模式连接到ms sql server 2005

mysql - 查询查找给定数字属于给定表中的任何范围

python - 通过复制记录创建大型数据集

java - Mongo 的 Java 驱动程序,如何构建复杂的查询

c# - 自定义 DataTable 上的 LINQ 查询