sunil mali Ответов: 2

Пожалуйста, помогите мне свернуть таблицу SQL ниже


Source	
AccountNo	GSTNumber
A1	1231
A1	1232
A1	1233
A2	1241
A2	1242
A3	1243
A3	1244
A3	1251
A3	1252
A4	1253

ожидаемый результат
AccountNo	Column1	Column2	Column3	Column4
A1	          1231	1232	1233	
A2	          1241	1242		
A3	          1243	1244	1251	1252
A4	          1253			


Что я уже пробовал:

select * from 
(select AccountNo, GSTIN from [GST Sales Report]) as s
PIVOT
(
GSTIN
 FOR GSTIN in ()
 )as pvt

2 Ответов

Рейтинг:
8

Rajat-Indiandotnet

Для динамических столбцов вы можете попробовать следующее решение

CREATE  table #source (AccountNo varchar(2), GSTNumber varchar (5) ,GSTAmount INT)
insert into #source (AccountNo, GSTNumber,GSTAmount) values
('A1',	'GST1',1231),
('A1',	'GST2',1232),
('A1',	'GST3',1233),
('A2',	'GST1',1241),
('A2',	'GST2',1242),
('A3',	'GST1',1243),
('A3',	'GST2',1244),
('A3',	'GST3',1251),
('A3',	'GST4',1252),
('A4',	'GST1',1253)





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

SELECT @cols = STUFF
        (
          (
            SELECT ',' + QUOTENAME(GSTNumber)
            FROM #source
            GROUP BY GSTNumber
                     
            ORDER BY GSTNumber
            FOR XML PATH(''), TYPE
          ).value('.', 'NVARCHAR(MAX)'),
          1,1,''
        );

SET @query = 'SELECT AccountNo,' + @cols + ' 
              FROM
              (
                SELECT AccountNo,GSTNumber,GSTAmount
                FROM #source
             ) x
             PIVOT
             (
                MAX(GStAmount)
                FOR GSTNumber IN (' + @cols + ')
             ) p ';

EXECUTE(@query);


sunil mali

Привет Раджат,
Большое вам спасибо за объяснение,
Но была проблема в моем объяснении вопроса, который я обновил, не могли бы вы, пожалуйста, оглянуться назад и вернуться ко мне.

Rajat-Indiandotnet

Пожалуйста, проверьте обновленный ответ.

sunil mali

Позвольте мне объяснить вам логику в деталях.
1. Одна учетная запись может иметь несколько кодов ОКП.
2. ГСТ количество меченых против Счет1 там не будет за помощью account2

Согласно вашему предложению, вы хотите, чтобы я создавал столбцы на основе чисел GST, поэтому, если есть 100000 чисел gst, я должен создать 100000 столбцов gst.
Я этого не хочу,
Я хочу, чтобы если Acount1 имеет 3 номера gst, то данные будут поступать только в column1, column2 и column3
Если Account2 имеет 2 номера gst, то данные будут поступать только в Column1 & Column2
Если учетная запись 3 имеет только 1 номер gst, то данные будут поступать только в столбец 1.
если Account4 имеет номера 10gst, то выходная таблица должна иметь column1...column10
и каждый столбец должен иметь разные номера gst.

sunil mali

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

sunil mali

Мне очень нужна помощь, так как я получаю этот тип запроса снова и снова, и я терплю неудачу.

Рейтинг:
12

CHill60

Нужно поставить значения в список и используйте функцию, например

clare @source table (AccountNo varchar(2), GSTNumber varchar (5))
insert into @source (AccountNo, GSTNumber) values
('A1',	'GST1'),
('A1',	'GST2'),
('A1',	'GST3'),
('A2',	'GST1'),
('A2',	'GST2'),
('A3',	'GST1'),
('A3',	'GST2'),
('A3',	'GST3'),
('A3',	'GST4'),
('A4',	'GST1')

SELECT * FROM 
	(select AccountNo, GSTNumber from @source) src
	PIVOT
	(
		MAX(GSTNumber)
		FOR GSTNumber in (GST1, GST2, GST3, GST4)
	) as pvt
Вы могли бы просто использовать MIN(GSTNumber), но у вас там должна быть функция


sunil mali

У меня возникли проблемы с именами столбцов, так как мои столбцы не фиксированы, как,
GST1, GST2, GST3, GST4
Это может иметь любую ценность,

ВЫБЕРИТЕ * ИЗ СПИСКА
(выберите AccountNo, GSTNumber из источника) src
СТЕРЖЕНЬ
(
Макс. (GSTNumber)
Для GSTNumber in (выберите GSTNumber из источника)
) как рядовой

я хочу использовать select query inside (in), как описано выше. но это не работает.

CHill60

Это не работает, потому что это не правильный синтаксис для Pivot! :-)
Этот список имеет чтобы содержать имена столбцов, сгенерированные сводкой, это не список значений.
В моей статье Циклы обработки в SQL Server[^] У меня есть пример того, как динамически генерировать этот список