如何保持某些列原样并动态旋转 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 个值:LostNo 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 中的最后一列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 旋转一列并保留其他列

如何在 SQL Server 中旋转文本列?

按某些列 SQL 旋转(转置)

SQL Server 中的动态透视列

有没有办法确保 SQL Server 标识列值即使在多次服务器重新启动后也始终保持一致?

sql server 按两列旋转多个字段