Member 12749874 Ответов: 2

Я ищу способ преобразования строк в столбцы в SQL server 2012


Вот мой пример:
Date        Itemname      qty     price 
01/09/2016  ABC           100     1000
02/09/2016  PQR           200     500
02/09/2016  ABC           50      500
04/09/2016  XYZ           10      100
05/09/2016  ABC           50      500

Я хочу результата:
Date             ABC           PQR           XYZ
             qty  price     qty  price      qty  price

01/09/2016   100  1000      
02/09/2016   50   500       200   500       
04/09/2016   50   100                       10    100


Имена элементов не фиксируются.У меня есть неизвестное количество названий предметов.

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

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

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for ColumnName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

Karthik_Mahalingam

опубликуйте ожидаемый результат в табличном формате. это не ясно.

2 Ответов

Рейтинг:
2

Member 12749874

Его работа работает только тогда, когда у меня есть фиксированные числовые столбцы.
Но у меня нет столбцов с фиксированными номерами.

Рейтинг:
19

CHill60

Далее следует Решение 1 и ваш комментарий к нему...

Первое, что нужно сделать, - это привести результаты в формат, необходимый для фиксированных данных, показанных в вашем примере.

Один из способов сделать это - сначала распаковать ваши данные, а затем сделать разворот, используя фиктивный столбец для кол-во и цены для каждого имени элемента, например

;with CTE as
(
	SELECT * FROM 
		(SELECT [Date], qty, price, itemname
		FROM yourTable) p
		UNPIVOT
	   (value FOR what IN (qty, price)
	)AS unpvt
)
select [Date],	ABCqty,ABCprice,
		PQRqty,PQRprice,
		XYZqty,XYZprice
from
(
	select [Date],value, ItemName + what as itemwhat
	from CTE
) qry
pivot 
(
	max(value)
    for itemwhat in ([ABCqty],[PQRqty],[XYZqty],[ABCprice],[PQRprice],[XYZprice])
) as pvt
order by [Date]

Как только вы поймете, что это работает, используйте метод, который вы уже использовали в разделе" Что я пробовал " вашего вопроса-генерируйте SQL динамически на основе фактического содержимого данных таблицы вместо жестко закодированных имен столбцов - вот фрагмент этого (остальное я оставлю вам)
select @cols = STUFF((SELECT ',' + QUOTENAME(ItemName + 'qty') +  ',' + QUOTENAME(ItemName + 'price') 
    from yourtable
    group by ItemName
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')


Если вы хотите, чтобы он отображался именно так, как вы ожидаете, то вы должны сделать это в своем слое презентации, а не в самом запросе


Maciej Los

Хорошо объяснил!

Member 12749874

большое вам спасибо ..его работы для известного количества колонок.
У меня есть список всех элементов названия, то его работы.