Я работаю над SQL Server. У меня есть образцы данных, подобные этому, в таблице.
идентификатор клиента | Банк | город | рейтинг | свидание | рнк |
---|---|---|---|---|---|
1 | немецкий | Дели | 5 | 10.10.2022 | 1 |
1 | БОА | Пуна | 6 | 10.10.2022 | 2 |
1 | УБС | Мумбаи | 7 | 10.10.2022 | 3 |
1 | ВОО | Чандигарх | 2 | 10.10.2022 | 4 |
2 | Ось | Джайпур | 1 | 10.10.2022 | 1 |
2 | Амекс | Дели | 3 | 10.10.2022 | 2 |
2 | СитиБнк | Калькутта | 4 | 10.10.2022 | 3 |
Мой желаемый результат
идентификатор клиента | Банк1 | город1 | рейтинг1 | дата1 | Банк2 | город2 | рейтинг2 | дата2 | Банк3 | город3 | рейтинг3 | дата3 | Банк4 | город4 | рейтинг4 | даты 4 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | немецкий | Дели | 5 | 10.10.2022 | БОА | Пуна | 6 | 10.10.2022 | УБС | Мумбаи | 7 | 10.10.2022 | ВОО | Чандигар | 2 | 10.10.2022 |
2 | Ось | Джайпур | 1 | 10.10.2022 | Амекс | Дели | 3 | 10.10.2022 | СитиБнк | Калькутта | 4 | 10.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
пользователь3580341