SQL-запрос для поворота таблицы в динамически растущий набор столбцов

Я работаю над SQL Server. У меня есть образцы данных, подобные этому, в таблице.

идентификатор клиентаБанкгородрейтингсвиданиернк
1немецкийДели510.10.20221
1БОАПуна610.10.20222
1УБСМумбаи710.10.20223
1ВООЧандигарх210.10.20224
2ОсьДжайпур110.10.20221
2АмексДели310.10.20222
2СитиБнкКалькутта410.10.20223

Мой желаемый результат

идентификатор клиентаБанк1город1рейтинг1дата1Банк2город2рейтинг2дата2Банк3город3рейтинг3дата3Банк4город4рейтинг4даты 4
1немецкийДели510.10.2022БОАПуна610.10.2022УБСМумбаи710.10.2022ВООЧандигар210.10.2022
2ОсьДжайпур110.10.2022АмексДели310.10.2022СитиБнкКалькутта410.10.2022

Столбцы будут расти в наборе из 4 и могут вырасти до сотен столбцов. Я попробовал поворот и должен повторить это несколько раз. Есть ли лучшее решение. Можно ли получить все повороты за один «выбор».

Поскольку столбцы динамические, я также не мог получить данные во временную таблицу. Но это невозможно с динамическим набором столбцов. Насколько я знаю, вы должны сначала объявить временную таблицу, только тогда вы сможете вставлять данные. В противном случае вам придется использовать глобальную временную таблицу, что, я думаю, не очень хорошая идея, поскольку эта база данных будет использоваться и другими сеансами. Пожалуйста, предложите решение.

Пожалуйста, просмотрите мой код. Моя попытка, которая работает, но нужно лучшее решение: —

IF OBJECT_ID('tempdb.dbo.#tempTbl', 'U') IS NOT NULL
  DROP TABLE #tempTbl;
IF OBJECT_ID('tempdb.dbo.#Bank', 'U') IS NOT NULL
  DROP TABLE #Bank; 
IF OBJECT_ID('tempdb.dbo.#City', 'U') IS NOT NULL
  DROP TABLE #City; 
IF OBJECT_ID('tempdb.dbo.#Rate', 'U') IS NOT NULL
  DROP TABLE #Rate; 
IF OBJECT_ID('tempdb.dbo.#DateR', 'U') IS NOT NULL
  DROP TABLE #DateR; 
IF OBJECT_ID('tempdb.dbo.#DataTbl', 'U') IS NOT NULL
  DROP TABLE #DataTbl
  

CREATE TABLE #tempTbl (CustId int, Bank varchar(10),city varchar(10), rating int, dateR date, rnk int)
INSERT INTO #tempTbl (CustId, Bank,city ,rating,dateR, rnk)
VALUES
 (1,'Deutsche','Delhi'     ,5 ,'10/10/2022', 1 )  
,(1,'BOA','Pune '     ,6 ,'10/10/2022', 2 )  
,(1,'UBS','Pune '     ,6 ,'10/10/2022', 3 )  
,(1,'SBI','Mumbai'    ,7 ,'10/10/2022', 4 )  
,(2,'Axis','Jaipur'    ,1,'10/10/2022', 1 )  
,(2,'Amex','Delhi'    ,3 ,'10/10/2022', 2 )  
,(2,'CitiBnk','Kolkatta ',4 ,'10/10/2022', 3 )


DECLARE @cols AS NVARCHAR(MAX) =''
        
SET @cols = STUFF((SELECT distinct ',' + 
            QUOTENAME(c.rnk) 
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

--================================bank====
DECLARE @colsBnk  AS NVARCHAR(MAX)='',
        @queryBnk  AS NVARCHAR(MAX)='';

SET @colsBnk = STUFF((SELECT distinct ',' + 
            '['+ CAST(c.rnk AS varchar) + '] AS Bank'+CAST(c.rnk AS varchar) 
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
set @queryBnk = 'SELECT CustId,'+ @colsBnk +' INTO ##tempBank FROM 
                ( SELECT CustId,Bank,rnk FROM #tempTbl ) as tbl
                PIVOT ( MAX(Bank) for rnk IN ('+@cols  +')  ) as pvt '

-- =============================================city==
DECLARE @colsCity  AS NVARCHAR(MAX)='',
        @queryCity  AS NVARCHAR(MAX)='';

SET @colsCity = STUFF((SELECT distinct ',' + 
            '['+ CAST(c.rnk AS varchar) + '] AS City'+CAST(c.rnk AS varchar) 
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @queryCity = 'SELECT CustId,'+ @colsCity +' INTO ##tempCity FROM 
                ( SELECT CustId,city,rnk FROM #tempTbl ) as tbl
                PIVOT(  MAX(city) for rnk IN ('+@cols  +')  ) as city 
                '
-- =============================================rating==
DECLARE @colsRate  AS NVARCHAR(MAX)='',
        @queryRate  AS NVARCHAR(MAX)='';

SET @colsRate = STUFF((SELECT distinct ',' + 
            '['+ CAST(c.rnk AS varchar) + '] AS Rate'+CAST(c.rnk AS varchar) 
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @queryRate="SELECT CustId,"+ @colsRate +' INTO ##tempRate  FROM 
                ( SELECT CustId,rating,rnk  FROM #tempTbl ) as tbl
                PIVOT(  MAX(rating) for rnk IN ('+@cols  +')    ) as rate 
                '
-- =============================================DateR==
DECLARE @colsDateR  AS NVARCHAR(MAX)='',
        @queryDateR  AS NVARCHAR(MAX)='';

SET @colsDateR = STUFF((SELECT distinct ',' + 
            '['+ CAST(c.rnk AS varchar) + '] AS DateR'+CAST(c.rnk AS varchar) 
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @queryDateR = 'SELECT CustId,'+ @colsDateR +' INTO ##tempDateR FROM 
                ( SELECT CustId,DateR,rnk FROM #tempTbl ) AS tbl
                PIVOT(  MAX(DateR) for rnk IN ('+@cols  +') ) as DateR 
                '
--========================================================================
/* pushing data into temp table from global temp table as this is a shared db*/ 

EXECUTE(@queryBnk)
SELECT * INTO #Bank FROM ##tempBank
DROP Table ##tempBank

EXECUTE(@queryCity)
SELECT * INTO #City FROM ##tempCity
DROP Table ##tempCity

EXECUTE(@queryRate)
SELECT * INTO #Rate FROM ##tempRate
DROP Table ##tempRate

EXECUTE(@queryDateR)
SELECT * INTO #DateR FROM ##tempDateR
DROP Table ##tempDateR


SET @cols = STUFF((SELECT distinct ',' + 
                'Bank' +CAST(c.rnk as varchar)
                ,', City'++CAST(c.rnk as varchar)
                ,', DateR'++CAST(c.rnk as varchar)
                ,', Rate'++CAST(c.rnk as varchar)
            FROM #tempTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

DECLARE @query AS NVARCHAR(MAX) =''
--SET @query = 'SELECT '

--SELECT @cols


SET @query = 'SELECT b.CustId, ' + @cols + '  
                INTO ##DataTbl
                FROM #Bank b
                LEFT JOIN #City c ON b.CustId = c.CustId
                LEFT JOIN #DateR d ON b.CustId = d.CustId
                LEFT JOIN #Rate r ON b.CustId = r.CustId'

EXECUTE(@query)
SELECT * INTO #DataTbl FROM ##DataTbl
DROP TABLE ##DataTbl

SELECT * FROM #DataTbl

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *