如何保持某些列不变并动态地旋转SQL Server 2012中的最后一列

时间:2019-05-30 23:20:32

标签: sql-server tsql pivot unpivot

我有一个表,该表包含5列,值为0或1,最后一列QuoteStatus的类型为VARCHAR

我想保持ControlNo和其他4列不变,但我需要对最后一列进行透视,并分配0或1的值。

它可以是两个以上的值:LostNo Action

所以数据现在看起来像这样:

enter image description here

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')

但是我希望它看起来像这样:

enter image description here

2 个答案:

答案 0 :(得分:1)

我们应该使用动态查询来获得结果。

在动态查询中:

  1. 表变量仅在定义它们的范围内可见。它们就像普通变量。我使用临时表代替了表变量。

如果OBJECT_ID('tempdb .. ## A')不是空表## A
如果OBJECT_ID('tempdb ..#table1')不是空DROP TABLE#table1

创建表#Table1                 (                     ControlNo INT,                     绑定INT,                     拒绝INT,                     额定INT                     引号为INT,                     QuoteStatus VARCHAR(50)                 )

INSERT INTO#Table1(控件号,界限,下降,额定,引用,QuoteStatus) 价值 (1111,1,0,1,1,'Lost'), (2222,0,1,0,1,“不采取行动”), (3333,1,1,0,0,NULL), (4444,1,0,0,1,'Lost'), (5555,0,1,1,1,“不采取行动”)

以NVARCHAR(MAX)声明@columns,     @finalquery AS NVARCHAR(MAX);

SET @columns = STUFF((选择不同的','+ QUOTENAME(QuoteStatus)             来自#Table1             FOR XML PATH(''),类型             ).value('。','NVARCHAR(MAX)')         ,1,1,'')

set @finalquery =' 选择     p.controlno,p.Bound,p.Declined,p.Rated,p.Quoted,'+ @columns +'
进入## A 从     (     选择         ControlNo,绑定,拒绝,额定,引用,QuoteStatus
来自#Table1
    )一种 枢     (     max(QuoteStatus)         用于QuoteStatus IN('+ @columns +')     )p'

exec(@finalquery)

选择     控制编号,界限,下降,额定,报价,     当Lost ='LOST'的情况下,否则1否则0以Lost结尾,     [no action] ='No Action'时的情况,否则1否则0以[No Action]结尾 来自## a

答案 1 :(得分:0)

我认为您正在寻找的是PIVOT运算符,对于这个问题,我认为您可以通过以下方法获得所需的结果:

SELECT *
FROM @Table1 a
PIVOT ( COUNT(QuoteStatus) FOR QuoteStatus IN ( [Lost], [No Action] ) b