如何保持某些列原样并动态旋转 SQL Server 2012 中的最后一列 [重复]
Posted
技术标签:
【中文标题】如何保持某些列原样并动态旋转 SQL Server 2012 中的最后一列 [重复]【英文标题】:How can I keep some columns as is and dynamically pivot the last column in SQL Server 2012 [duplicate] 【发布时间】:2019-05-30 23:20:32 【问题描述】:我有一个包含 5 列的表,其值为 0 或 1,最后一列 QuoteStatus
的类型为 VARCHAR
。
我想保持 ControlNo
和其他 4 列不变,但我需要旋转最后一列并分配值 0 或 1。
它可以超过 2 个值:Lost
或 No Action
。
所以数据现在看起来像这样:
DECLARE @Table1 TABLE
(
ControlNo INT,
Bound INT,
Declined INT,
Rated INT,
Quoted INT,
QuoteStatus VARCHAR(50)
)
INSERT INTO @Table1 (ControlNo, Bound, Declined, Rated, Quoted, QuoteStatus)
VALUES
(1111,1,0,1,1,'Lost'),
(2222,0,1,0,1,'No Action'),
(3333,1,1,0,0,NULL),
(4444,1,0,0,1,'Lost'),
(5555,0,1,1,1,'No Action')
但我希望它看起来像这样:
【问题讨论】:
【参考方案1】:我们应该使用动态查询来获得结果。
在动态查询中:
-
表变量仅在定义它们的范围内可见。它们就像正常变量。我使用临时表而不是表变量。
IF OBJECT_ID('tempdb..##A') 不是 NULL DROP TABLE ##A IF OBJECT_ID('tempdb..#table1') IS NOT NULL DROP TABLE #table1
创建表 #Table1 ( ControlNo INT, 绑定INT, 拒绝INT, 额定INT, 引用INT, 报价状态 VARCHAR(50) )
INSERT INTO #Table1(ControlNo、Bound、Declined、Rated、Quoted、QuoteStatus) 价值观 (1111,1,0,1,1,'丢失'), (2222,0,1,0,1,'无动作'), (3333,1,1,0,0,NULL), (4444,1,0,0,1,'丢失'), (5555,0,1,1,1,'无动作')
将@columns 声明为 NVARCHAR(MAX), @finalquery AS NVARCHAR(MAX);
SET @columns = STUFF((SELECT distinct ',' + QUOTENAME(QuoteStatus) 来自#Table1 FOR XML PATH(''), 类型 ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
设置@finalquery = ' 选择 p.controlno,p.Bound, p.Declined, p.Rated,p.Quoted,' + @columns + ' 进入##A 从 ( 选择 ControlNo、绑定、拒绝、评级、引用、引用状态 来自#Table1 )一种 枢 ( 最大值(报价状态) 对于 QuoteStatus IN (' + @columns + ') )p'
执行(@finalquery)
选择 ControlNo,绑定,拒绝,额定,引用, 如果 Lost = 'LOST' then 1 else 0 end as Lost, [no action] = 'No Action' then 1 else 0 end as [No Action] 的情况 来自##a
【讨论】:
【参考方案2】:我认为您正在寻找的是 PIVOT 运算符,对于这个问题,我认为您可以通过以下方式获得所需的结果:
SELECT *
FROM @Table1 a
PIVOT ( COUNT(QuoteStatus) FOR QuoteStatus IN ( [Lost], [No Action] ) b
【讨论】:
以上是关于如何保持某些列原样并动态旋转 SQL Server 2012 中的最后一列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章