Это довольно странное требование ... Но вы можете попробовать кое-что из этого:
DECLARE @sales TABLE(BrandID INT, color VARCHAR(10),size VARCHAR(10));
INSERT INTO @sales VALUES
(2,'red', 'big'),
(3,'blue', 'big'),
(2,'blue', 'big'),
(2,'red', 'small'),
(2,'blue', 'medium'),
(3,'green', 'small'),
(3,'red', 'big'),
(1,'green', 'medium'),
(2,'red', 'medium'),
(2,'blue', 'big');
WITH AllBrands AS (SELECT ROW_NUMBER() OVER(ORDER BY BrandID) AS RowInx, BrandID FROM @sales GROUP BY BrandID)
,AllColors AS (SELECT ROW_NUMBER() OVER(ORDER BY color) AS RowInx, color FROM @sales GROUP BY color)
,AllSizes AS (SELECT ROW_NUMBER() OVER(ORDER BY size) AS RowInx, size FROM @sales GROUP BY size)
SELECT COALESCE(b.RowInx,c.RowInx,s.RowInx) AS RowInx
,b.BrandID
,c.color
,s.size
FROM AllBrands b
FULL OUTER JOIN AllColors c ON COALESCE(b.RowInx,c.RowInx)=c.RowInx
FULL OUTER JOIN AllSizes s ON COALESCE(b.RowInx,c.RowInx,s.RowInx)=s.RowInx;
Это решение аналогично @ a_horse_with_no_name's, но позволяет избежать пропусков в результате в случае неравного количества значенийна столбец.
Идея вкратце:
Мы создаем пронумерованный набор всех отдельных значений в столбце и объединяем все наборы на этом числе.Поскольку мы не знаем заранее, я использую COALESCE
, чтобы выбрать первое значение, которое не равно нулю.