2011-02-01 2 views
0

У меня есть две таблицы: tblSizes и tblColors. tblColors имеет столбцы ColorName, ColorPrice и SizeID. Существует один размер для нескольких цветов. Мне нужно написать запрос, чтобы выбрать размер и все цвета (в виде столбцов) для этого размера с ценой каждого размера в соответствующем столбце.Как выбрать записи как столбцы в SQL

цвета должен быть возвращен в виде столбцов, например:

SizeID : Width : Height : Red : Green : Blue 
1---------220-----220----£15----£20-----£29 

Надеется, что это имеет смысл
Спасибо

Edit: Попробовал следующий код, но не совсем уверен, что это не так:

DECLARE @Colors NVARCHAR(4000), @Query NVARCHAR(MAX) 
SET @Colors = '' 

SELECT @Colors = @Colors + '[' + C.Color +'],' 
FROM tblTempProductSizesColors SC 
INNER JOIN tblColors C on SC.ColorID=C.ID 
GROUP BY Color 
ORDER BY Color 

SET @Colors = LEFT(@Colors,LEN(@Colors)-1) 


SET @Query = ' 
SELECT * 
FROM ( SELECT TS.Sizeid, TS.Width, TS.Height, TS.Depth, TC.Price 
     FROM tblTempProductSizes TS 
     INNER JOIN tblTempProductSizesColors TC 
     ON TS.SizeId = TC.SizeId INNER JOIN tblColors C on TC.ColorID=C.ID) A 
     PIVOT(SUM(Price) FOR C.Color IN ('[email protected]+')) AS PT' 

EXEC sp_executesql @Query 
+4

Почему вы не можете запрашивать базу данных, а затем поворачивайте результаты в формате, который вы хотите? – OrangeDog

+1

Какой двигатель базы данных вы используете? – Lamak

+0

@Lamak - Я использую MSSQL. – Leigh

ответ

0

Если вы не хотите, чтобы rite каждый цвет и выражение для этих столбцов, вы можете использовать Dynamic SQL, если у вас есть MSSQL 2005+ (во-первых, не забудьте взглянуть на это link).
ОБНОВЛЕНО следующий комментарий

DECLARE @Colors NVARCHAR(4000), @Query NVARCHAR(MAX) 
SET @Colors = '' 

SELECT @Colors = @Colors + '[' + C.Color +'],' 
FROM tblTempProductSizesColors SC 
INNER JOIN tblColors C on SC.ColorID=C.ID 
GROUP BY Color 
ORDER BY Color 

SET @Colors = LEFT(@Colors,LEN(@Colors)-1) 


SET @Query = ' 
SELECT * 
FROM ( SELECT TS.Sizeid, TS.Width, TS.Height, TS.Depth, TC.Price, C.Color 
     FROM tblTempProductSizes TS 
     INNER JOIN tblTempProductSizesColors TC 
     ON TS.SizeId = TC.SizeId INNER JOIN tblColors C on TC.ColorID=C.ID) A 
     PIVOT(SUM(Price) FOR Color IN ('[email protected]+')) AS PT' 

EXEC sp_executesql @Query 
+0

Ламак, спасибо, что написал это. Похоже, что он должен работать, но ... Когда я задал вопрос, я попытался упростить свою проблему, а не объяснять все это подробно. На самом деле три таблицы. Я попытался модифицировать ваш код, но не совсем уверен, где все пошло не так. Я опубликовал в своем предыдущем вопросе ваш модифицированный код. – Leigh

+0

@Leigh Я обновил свой ответ, изменив свой код, поэтому я думаю, вам стоит попробовать еще раз и сказать, работает ли он. – Lamak

+0

Lamak вы абсолютная легенда! Большое вам спасибо за помощь в этом, ваш код работает отлично. – Leigh

2
select s.Sizeid, s.Width, s.Height, 
Red = SUM(CASE WHEN c.ColorName = "Red" THEN c.ColorPrice ELSE 0 END), 
Blue = SUM(CASE WHEN c.ColorName = "Blue" THEN c.ColorPrice ELSE 0 END), 
Green = SUM(CASE WHEN c.ColorName = "Green" THEN c.ColorPrice ELSE 0 END) 
from tblSizes s 
join tblColors c on c.SizeId = s.SizeId 
group by s.Sizeid, s.Width, s.Height 
+0

Спасибо, Джон. Это именно то, что мне нужно - но .. Мне нужно было бы напечатать каждый цвет в запросе, и я бы получил столбец для каждого цвета. Это единственный способ? – Leigh

+0

@Leigh: Я думаю, что это единственный способ в ванильном SQL, вы используете сервер БД, который поддерживает «PIVOT», например. SQL Server? – Tony

+0

Это, вероятно, будет намного медленнее, чем выборка данных и их поворот. – OrangeDog

Смежные вопросы