nyiks nyoks Ответов: 1

SQL server сводит и объединяет строки


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

Описание Catgry ItemCode poorder 001CAL 002BAL 003VAL
#2 Avery Tag H000021803 6445 1 NULL NULL
C002-A HBW шариковая ручка черный M000004820 6446 NULL 1 NULL
C002-A HBW шариковая ручка черный M000004820 6447 NULL NULL 144
C002-A HBW шариковая ручка синий M000040437 6446 NULL 1 NULL
C002-A HBW шариковая ручка синий M000040437 6447 NULL NULL 144
C002-A HBW шариковая ручка Красный M000040438 6446 NULL 1 NULL
C002-A HBW шариковая ручка Красный M000040438 6447 NULL NULL 144
C009-A Манильская бумага CAT B M000005161 6445 1 NULL NULL
C009-A Манильская бумага CAT B M000005161 6446 NULL 1 NULL
C009-A Манильская бумага CAT B M000005161 6447 NULL NULL 144

но я хочу, чтобы preview2 был..
Описание Catgry ItemCode poorder 001CAL 002BAL 003VAL
#2 Avery Tag H000021803 6445 1 NULL NULL
C002-A HBW шариковая ручка Черная M000004820 6446,6447 NULL 1 144
C002-A HBW шариковая ручка синий M000040437 6446,6447 NULL 1 144
C002-A HBW шариковая ручка красная M000040438 6446,6447 NULL 1 144
C009-A Манильская бумага CAT B M000005161 6445,6446,6447 1 1 144

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

я использую pivot на prev1, но когда я показываю colonm poorder, он не сливается, а группирует его сам, а также я использую подзапрос со слиянием строк, но ничего хорошего, потому что он сливает все poorder.

CHill60

Очень трудно определить, что это за данные, так как они не отформатированы. Эта колонка называется [описания Кетгри]? Это M000004820 Ан артикул

nyiks nyoks

извините просто чтобы уточнить,
[Описания] [Кетгри] [ItemCode] [poorder] [001CAL] [002BAL] [003VAL]
[C009-A Манильская бумага] [CAT B] [M000005161] [6445] [1] [NULL] [НУЛЕВОЙ]

1 Ответов

Рейтинг:
12

CHill60

Предполагая, что ваш стол выглядит так:

create table prev1
(
	Descriptions nvarchar(125),
	ItemCode nvarchar(125),
	poorder int,
	[001CA] int,
	[002BAL] int,
	[003VAL] int
)
insert into prev1 values
('#2 Avery Tag'			,'H000021803', 6445, 1, NULL, NULL ),
('C002-A HBW Ballpen Black'	,'M000004820', 6446, NULL, 1, NULL ),
('C002-A HBW Ballpen Black'	,'M000004820', 6447, NULL, NULL, 144 ),
('C002-A HBW Ballpen Blue'	,'M000040437', 6446, NULL, 1, NULL ),
('C002-A HBW Ballpen Blue'	,'M000040437', 6447, NULL, NULL, 144 ),
('C002-A HBW Ballpen Red'	,'M000040438', 6446, NULL, 1, NULL ),
('C002-A HBW Ballpen Red'	,'M000040438', 6447, NULL, NULL, 144 ),
('C009-A Manila Paper CAT B'	,'M000005161', 6445, 1, NULL, NULL ),
('C009-A Manila Paper CAT B'	,'M000005161', 6446, NULL, 1, NULL ),
('C009-A Manila Paper CAT B'	,'M000005161', 6447, NULL, NULL, 144 )

Затем вы можете использовать этот запрос:
;WITH CTE AS
(
	SELECT ItemCode, poorder = 
    STUFF((SELECT ', ' + CAST(poorder as nvarchar)
           FROM prev1 p1
           WHERE p1.ItemCode = p2.ItemCode 
          FOR XML PATH('')), 1, 2, '')
	FROM prev1 p2
	GROUP BY ItemCode
)
SELECT Descriptions, P.ItemCode, CTE.poorder, [001CA] = SUM([001CA]),[002BAL] = SUM([002BAL]),[003VAL] = SUM([003VAL])
FROM prev1 P
INNER JOIN CTE ON P.ItemCode=CTE.ItemCode
GROUP BY Descriptions, P.ItemCode, CTE.poorder
что дает результаты
#2 Avery Tag		  H000021803	6445		 1	NULL	NULL
C002-A HBW Ballpen Black  M000004820	6446, 6447	 NULL	1	144
C002-A HBW Ballpen Blue   M000040437	6446, 6447	 NULL	1	144
C002-A HBW Ballpen Red	  M000040438	6446, 6447	 NULL	1	144
C009-A Manila Paper CAT B M000005161	6445, 6446, 6447 1	1	144

Объяснение:
CTE (Common Table Expression) объединяет различные значения [poorder] в разделенный запятыми список для каждого ItemCode следующим образом:
00021803	6445
M000004820	6446, 6447
M000005161	6445, 6446, 6447
M000040437	6446, 6447
M000040438	6446, 6447
Затем мы соединяем это обратно с исходной таблицей. Нет необходимости поворачиваться, так как мы можем получить другие значения столбцов с помощью SUM