【问题标题】:Getting error when dynamically unpivoting in SQL Server 2012在 SQL Server 2012 中动态反透视时出现错误
【发布时间】:2023-04-09 09:03:02
【问题描述】:

目标是动态透视数据,然后动态取消透视数据。

我收到一条错误消息,提示 Invalid ControlNo

我假设它是因为变量 @colsUnpivot 包含 ControlNo 列。

但是我该如何解决呢?我绝对需要那个 ControlNo。

IF OBJECT_ID('tempdb..##A') IS NOT NULL DROP TABLE ##A
IF OBJECT_ID('tempdb..#table1') IS NOT NULL DROP TABLE #table1

Create table #Table1 ( 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')

DECLARE @columns AS NVARCHAR(MAX), 
        @finalquery AS NVARCHAR(MAX);

SET @columns = STUFF((SELECT distinct ',' + QUOTENAME(QuoteStatus) FROM #Table1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
--PRINT @columns

set @finalquery = '
        select  p.controlno,
                p.Bound, 
                p.Declined, 
                p.Rated,
                p.Quoted,' + @columns + '
        into ##A 
        from ( select ControlNo, Bound, Declined, Rated, Quoted, QuoteStatus
                from #Table1
            )a 
    pivot 
    ( 
     COUNT(QuoteStatus) 
     for QuoteStatus IN (' + @columns + ') 
    )p '

exec(@finalquery)

--SELECT * 
--FROM ##a


DECLARE @colsUnpivot AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM tempdb.sys.columns c
           WHERE c.object_id = OBJECT_ID('tempdb..##A') 
           for xml path('')), 1, 1, '')
--PRINT @colsUnpivot

set @query 
  = 'select ControlNo, Counts, Status
     from ##A
     unpivot
     (
        Counts
        for Status in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

输出应如下所示:

【问题讨论】:

  • 检查您的排序规则,您正在创建一个全小写 controlno 的列并以混合大小写形式阅读
  • 您在选择列表和 unpivot 组中有 ControlNo...select @colsunpivot
  • 谢谢。但我很困惑我怎么会在@colsunpivot 中没有它?

标签: sql-server tsql pivot dynamic-sql unpivot


【解决方案1】:

我假设您的样本输出是一个样本,并且您排除了其他控制编号。如果是这样,更改stuff 中的where 子句将从unpivot 组中删除该列,并为您提供所需的结果。您不能返回正在旋转或取消旋转的列。

IF OBJECT_ID('tempdb..##A') IS NOT NULL DROP TABLE ##A
IF OBJECT_ID('tempdb..#table1') IS NOT NULL DROP TABLE #table1

Create table #Table1 ( 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')

DECLARE @columns AS NVARCHAR(MAX), 
        @finalquery AS NVARCHAR(MAX);

SET @columns = STUFF((SELECT distinct ',' + QUOTENAME(QuoteStatus) FROM #Table1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
--PRINT @columns

set @finalquery = '
        select  p.controlno,
                p.Bound, 
                p.Declined, 
                p.Rated,
                p.Quoted,' + @columns + '
        into ##A 
        from ( select *
                from #Table1
            )a 
    pivot 
    ( 
     COUNT(QuoteStatus) 
     for QuoteStatus IN (' + @columns + ') 
    )p '

exec(@finalquery)

--SELECT * 
--FROM ##a


DECLARE @colsUnpivot AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM tempdb.sys.columns c
           --notice i remove controlno here...
           WHERE c.object_id = OBJECT_ID('tempdb..##A') and c.name <> 'controlno'
           for xml path('')), 1, 1, '')
--PRINT @colsUnpivot


set @query 
  = 'select  Controlno, Counts, Status
     from ##A
     unpivot
     (
        Counts
        for Status in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

要获得准确的输出,只需将 where 子句添加到 set @query

set @query 
  = 'select  Controlno, Counts, Status
     from ##A
     unpivot
     (
        Counts
        for Status in ('+ @colsunpivot +')
     ) u
     where controlno = 1111'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多