如何在 unpivot 查询中包含 id 列

Posted

技术标签:

【中文标题】如何在 unpivot 查询中包含 id 列【英文标题】:How do I include the id column in a unpivot query 【发布时间】:2017-05-04 00:51:41 【问题描述】:

我有一个返回此结果的简单查询

TransactionIdentifier TransactionType DateTimeStamp
1 销毁 2015 年 12 月 23 日上午 7:43
2 管理层 2013 年 5 月 21 日凌晨 2:01

我想把它转换成下面的格式

TransactionIdentifier 列名值 1 事务标识符 1 1 TransactionType 销毁 1 日期时间戳 2015 年 12 月 23 日上午 7:43 2 交易标识符 2 2 事务类型管理 2 日期时间戳 2013 年 5 月 21 日凌晨 2:01

这是我目前的查询

 SELECT V.ColumnName, V.Value
    FROM (SELECT CONVERT( VARCHAR(4000), TransactionIdentifier) AS TransactionIdentifier,
                 转换(VARCHAR(4000),事务类型)作为事务类型,
                 转换(VARCHAR(4000),DateTimeStamp)作为 DateTimeStamp
          来自交易
          WHERE TransactionIdentifier IN(1, 2)) AS A1
         UNPIVOT(Value FOR ColumnName IN(TransactionIdentifier,TransactionType,DateTimeStamp)) AS V

它返回这个

列名值 事务标识符 1 TransactionType 销毁 日期时间戳 2015 年 12 月 23 日上午 7:43 事务标识符 2 事务类型管理 日期时间戳 2013 年 5 月 21 日凌晨 2:01

如何将 TransactionIdentifier 字段添加到结果中?

【问题讨论】:

【参考方案1】:

只需从 unpivot 中删除 TransactionIdentifier 并将其添加到 Select 语句中

SELECT TransactionIdentifier ,V.ColumnName, V.Value
    FROM (SELECT CONVERT( VARCHAR(4000), TransactionIdentifier) AS TransactionIdentifier,
                 CONVERT( VARCHAR(4000), TransactionType) AS TransactionType,
                 CONVERT( VARCHAR(4000), DateTimeStamp) AS DateTimeStamp
      FROM Transactions
      WHERE TransactionIdentifier IN(1, 2)) AS A1 

     UNPIVOT(Value FOR ColumnName IN(TransactionType,DateTimeStamp)) AS V

输出:

TransactionIdentifier   ColumnName          Value
1                       TransactionType     Destruction
1                       DateTimeStamp       Dec 23 2015  7:43AM
2                       TransactionType     Management
2                       DateTimeStamp       May 21 2013  2:01AM

希望对您有所帮助。

【讨论】:

完美,我丢失了 ID Row,但它仍然适合我的需要。谢谢。 您可以通过复制您的 id 列两次并提供不同的名称(即作为 TransactionIdentifier2)来克服这个问题。添加一个以选择,一个以取消透视。

以上是关于如何在 unpivot 查询中包含 id 列的主要内容,如果未能解决你的问题,请参考以下文章

如何在主查询中编写 Unpivot 查询?

如何在ifelse中包含NA?

如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?

在列中包含今天日期的 VBA 查询数据

如何在第三个查询中包含来自其他两个表的过滤行数?

如何使用 MYSQL 在最终表中包含所有列的默认值为 0 的缺失行?