我有一个表,该表包含5列,值为0或1,最后一列QuoteStatus
的类型为VARCHAR
。
我想保持ControlNo
和其他4列不变,但我需要对最后一列进行透视,并分配0或1的值。
它可以是两个以上的值: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')
但是我希望它看起来像这样:
答案 0 :(得分: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