sql - 基于 TSQL/Microsoft SQL Server 中的另一个字段对字段值进行透视

标签 sql sql-server-2008 t-sql ms-access-2010

好吧,这是我的一个包含示例数据的表格。 itemCode 和 dateType 有一个唯一的键,因此 itemCode 不能具有重复的 dateType,反之亦然。 dateStatus 也是一种位数据类型。

+----+----------+----------+------------+-----------+--------------+
| id | itemCode | dateType | dateStatus |  dateDue  | dateComplete |
+----+----------+----------+------------+-----------+--------------+
|  1 |      501 | aa       |          1 | 1/1/2014  | 5/1/2014     |
|  2 |      501 | bb       |          0 | 1/2/2014  |              |
|  3 |      501 | cc       |          0 | 1/3/2014  |              |
|  4 |      602 | aa       |          0 | 1/4/2014  |              |
|  5 |      602 | bb       |          1 | 1/5/2014  | 5/5/2014     |
|  6 |      602 | cc       |          0 | 1/6/2014  |              |
|  7 |      602 | dd       |          0 | 1/7/2014  |              |
|  8 |      703 | bb       |          0 | 1/8/2014  |              |
|  9 |      703 | cc       |          0 | 1/9/2014  |              |
| 10 |      703 | dd       |          1 | 1/10/2014 | 5/10/2014    |
+----+----------+----------+------------+-----------+--------------+

我尝试根据 itemCode 调整 dateType,并将值设置为 dateComplete 或 dateDue,具体取决于 dateStatus 是 0 还是 1。

+----------+---------------+---------------+---------------+----------------+
| itemCode |      aa       |      bb       |      cc       |       dd       |
+----------+---------------+---------------+---------------+----------------+
|      501 | fin: 5/1/2014 | due: 1/2/2014 | due: 1/3/2014 |                |
|      602 | due: 1/4/2014 | fin: 5/5/2014 | due: 1/6/2014 | due: 1/7/2014  |
|      703 |               | due: 1/8/2014 | due: 1/9/2014 | fin: 5/10/2014 |
+----------+---------------+---------------+---------------+----------------+

我可以在 Access Query CrossTab 中轻松完成此操作,并且 SQL 结果在

TRANSFORM First(Switch([dateStatus]=0,"due: " & [dateDue],
                       [dateStatus]=1,"fin: " & [dateComplete])) AS Expr1
SELECT Table1.itemCode
FROM Table1
GROUP BY Table1.itemCode
PIVOT Table1.dateType In ("aa","bb","cc","dd");

但我不知道如何在 TSQL/Microsoft SQL Server Management Studio 中构建此查询。我可以完成一些基本的数据透视,但聚合函数似乎无法提取值,因此我认为查询可能是数据透视、联接和 case 语句的组合。或者也许我把事情过于复杂化了。

任何可供引用的代码都会非常有帮助。谢谢。

最佳答案

试试这个。它比接受的答案更简单,并且更具可扩展性,就像添加了另一个 dateType 一样。您所要做的就是在数据透视表中添加值,而不是一个全新的 case 语句。

DECLARE @pivotCols VARCHAR(MAX);

SELECT @pivotCols =  COALESCE(@pivotCols + ',','') + QUOTENAME(dateType)
FROM @yourTable
GROUP BY dateType

EXEC
(
'SELECT *
FROM
(
    SELECT  itemCode,
            CASE 
                WHEN dateStatus = 1 
                    THEN ''fin: '' + CAST(dateComplete AS CHAR(10))
                ELSE ''due: ''  + CAST(dateDue AS CHAR(10))
            END dateDue,
            dateType
    FROM @yourTable
) A
PIVOT
(
    MAX(dateDue) FOR dateType IN (' + @pivotCols + ')
) pvt'
)

关于sql - 基于 TSQL/Microsoft SQL Server 中的另一个字段对字段值进行透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134152/

相关文章:

mysql - 在 MySQL 和 SQL Server 中查询?

sql - SQL Server 2008 中的累积添加

mysql - 我可以将同一个表中的多列与所有数据合并在一列中吗?

java - 如何将表值参数从java传递到sql server存储过程?

sql-server - 将分区移动到新文件组

sql - PostgreSQL 中一致的域/类型别名行为

html - 适用于 HTML 和文本的回车符

sql-server-2008 - 在 SQL 中使用多个 View 而不是单个 View 有什么好处吗?

t-sql - group by 和 join 的累计和

sql - TSQL - 通过智能减少记录数量 - 模式(崩溃影响数据)