尝试在 T-SQL 中转置和创建枢轴
Posted
技术标签:
【中文标题】尝试在 T-SQL 中转置和创建枢轴【英文标题】:Trying to transpose and create pivot in T-SQL 【发布时间】:2015-11-23 14:38:26 【问题描述】:我正在努力使用 unpivot 和 pivot 命令,但不能完全正确。 我想使用 Transact SQL 从表 1 转置到表 2:
click here to see my source and destination tables
我怎样才能做到这一点?到目前为止,我得到了这个:
SELECT CASE RIGHT(name, 1) WHEN 'R' THEN CONVERT(nvarchar(6), Q) + 'R'
WHEN 'D' THEN CONVERT(nvarchar(6), Q) + 'D'
ELSE CONVERT(nvarchar(6), Q) + 'A' END AS Q1,
value, name
FROM (SELECT Q, a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD
FROM vw_VAT) src
unpivot (value FOR name IN (a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD)) sel
pivot ???
但是我无法正确使用 pivot 命令。 有人可以帮帮我吗?
BR,emphyrio
【问题讨论】:
请至少以文本而不是图片的形式创建您的示例,如果您需要更快的帮助,请在 SQL Fiddle 中创建一个示例。 我自己解决了这个难题,使用这个 T-SQL: 【参考方案1】:我自己解决了这个难题,使用这个 T-SQL:
SELECT * FROM (
SELECT CASE RIGHT(name, 1) WHEN 'R' THEN CONVERT(nvarchar(6), Q) + 'R'
WHEN 'D' THEN CONVERT(nvarchar(6), Q) + 'D'
ELSE CONVERT(nvarchar(6), Q) + 'A' END AS Q1,
CASE RIGHT(name, 1) WHEN 'R' THEN LEFT(name, LEN(name) -1)
WHEN 'D' THEN LEFT(name, LEN(name) -1)
ELSE name END AS name,
value
FROM (SELECT Q, a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD
FROM vw_VAT) src
unpivot (value FOR name IN (a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD)) up) main
pivot (SUM(value) FOR Q1 IN ([201501A], [201502A], [201503A], [201504A], [201501R], [201502R], [201503R], [201504R], [201501D], [201502D], [201503D], [201504D])) piv
现在唯一剩下的就是动态地改变 pivot 命令的 IN 子句。但这很容易,现在我找到了解决方案。
Emphyrio。
【讨论】:
以上是关于尝试在 T-SQL 中转置和创建枢轴的主要内容,如果未能解决你的问题,请参考以下文章