簡體   English   中英

SQL Server:多列的動態數據透視和列的序列號

[英]SQL Server: Dynamic Pivot for multiple columns and sequenced number for columns

我在動態樞軸方面遇到了麻煩。 我試圖按照這個例子: SQL Server : dynamic pivot over 5 columns但沒有得到我想要的結果。

數據如下

AccDate     Account  AccountDescription      Amount  VatValue    CalcLevel   CalcObject
2020-08-31  4101     Purchaces                33750      4725        First      8309
2020-08-31  4101     Purchaces                33750      4725       Second       110
2020-08-31  4101     Purchaces                33750      4725        Third       111
2020-08-31  2660     VAT                       4725         0         NULL       NULL

有了這個查詢

select AccDate, AccountDescription, Amount, VatValue, 'First' AS [CalcLevel1], 'Second' AS [CalcLevel2], 'Third' AS[CalcLevel3], '8309' AS [CalcObject1], '110' AS [CalcObject2], '111' AS [CalcObject3]
from
(    
   SELECT
       
       AccDate,
       Account,
       AccountDescription,
       Amount,
       VatValue,
       CalcLevel
    FROM MyTable WHERE CalcLevel IS NOT NULL
) a
pivot
(
 MIN(CalcLevel) for Account in ([First], [Second], [Third], [8309], [110], [111])
) as pvt;

我得到了結果,這是正確的

AccDate        AccountDescription   Amount  VatValue    CalcLevel1  CalcLevel2  CalcLevel3  CalcObject1 CalcObject2 CalcObject3
2020-08-31     Purchaces            33750     4725         First      Second       Third         8309        110        111

但我真正需要的是動態樞軸(有多個 Calclevels 和 CalcObjects)。 所以結果應該是這樣的

AccDate        AccountDescription   Amount  VatValue    CalcLevel1  CalcLevel2  CalcLevel3  CalcLevel[n]    CalcObject1 CalcObject2 CalcObject3 CalcObject[n]
2020-08-31     Purchaces            33750     4725         First      Second       Third      result[n]        8309         110         111       result[n]

我在下面嘗試了這個查詢,但到目前為止一無所獲。 是否有可能獲得我用動態樞軸描述的結果?


declare @sql nvarchar(max)
declare @cols nvarchar(max)

declare @sql nvarchar(max)
declare @cols nvarchar(max)

select @cols = STUFF((SELECT ',' + QUOTENAME(+col+CalcLevel)+','+QUOTENAME(col+CalcObject)
                  from mytable t
                  cross apply
                  (
                      select 'CalcLevel'
                      union all
                      select 'CalcObject'

                  ) c (col)
                  group by col, CalcLevel, CalcObject
                  order by CalcLevel, CalcObject
          FOR XML PATH(''), TYPE
          ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'')

      select @cols

set @sql =
'SELECT  AccDate, AccountDescription, Amount, VatValue, ' + @cols + '
FROM
( select AccDate, AccountDescription, Account, Amount, VatValue,  CalcLevel,
      col = CalcLevel+''_''+CalcObject+''_''+col, 
      value
  from mytable t
  cross apply
  (
      select ''CalcLevel'', CalcLevel 
      union all
      select ''CalcObject'', CalcObject
  ) c (col, value)
) AS s
PIVOT
(
min(CalcLevel)
FOR Account IN (' + @cols + ')
) AS pvt
'

EXEC(@sql)

這個給你

create table MyTable 
(
accdate date,
account varchar(100),
accountdescription varchar(100),
amount bigint,
vatvalue int,
calcLevel varchar(100),
calcObject varchar(100)
)
insert into MyTable
values
('20200831', 4101, 'purchaces',33750,4725,'first','8309'),
('20200831', 4101, 'purchaces',33750,4725,'second','110'),
('20200831', 4101, 'purchaces',33750,4725,'third','111'),
('20200831', 2660, 'VAT',4725,0,null,null)
select * from MyTable

declare @sql nvarchar(max)
declare @cols nvarchar(max)
declare @colsLevel nvarchar(max)
declare @colsObject nvarchar(max)

select @cols = STUFF((SELECT ',' + QUOTENAME(calcLevel) +','+ QUOTENAME(CalcObject)
                  from mytable t
                    
                  where calcLevel is not null       
                  group by CalcLevel, CalcObject
                  order by CalcLevel, CalcObject
          FOR XML PATH(''), TYPE
          ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'')
       select @cols

select @colsLevel = STUFF((SELECT ',''' + calcLevel + ''' as ' + QUOTENAME('CalcLevel'+convert(varchar(100), ROW_NUMBER() OVER(ORDER BY  CalcLevel asc)))
                  from mytable t                  
                  where calcLevel is not null       
                  group by CalcLevel
                  order by CalcLevel
          FOR XML PATH(''), TYPE
          ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'')

      select @colsLevel

      select @colsObject = STUFF((SELECT ',''' + CalcObject + ''' as ' +QUOTENAME('CalcObject'+convert(varchar(100),ROW_NUMBER() OVER(ORDER BY CalcObject asc)))
                  from mytable t
                   where CalcObject is not null 
                   group by CalcObject
                  order by CalcObject
          FOR XML PATH(''), TYPE
          ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'')

      select @colsObject

set @sql =
'SELECT  AccDate, AccountDescription, Amount, VatValue, ' + @colsLevel + ', ' + @colsObject + '
FROM
( select AccDate, AccountDescription, Account, Amount, VatValue,  CalcLevel         
  from mytable t
) AS s
PIVOT
(
min(CalcLevel)
FOR Account IN (' + @cols + ')
) AS pvt
'
print (@sql)
EXEC(@sql)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM