2011-01-11 6 views
0

, пожалуйста, рассмотрите этот упрощенный сценарий для базы данных SQL Server. Это не совсем так, как мои таблицы построены, но примера достаточно для того, что мне нужно знать.Как отобразить консолидированную версию таблицы SQL Server?

У меня есть таблица продуктов с первичным ключом, допустим, IdProduct и некоторые другие столбцы, такие как название и описание продукта.

Тогда у меня есть что-то вроде общего объема продаж в месяц (SalesPerMonth). В этой второй таблице приведены некоторые поля, такие как

IdMonthlySale (key) 
IdProduct (foreign key to the main table) 
TotalSales (money) 
Monthy (int or smallint) 
Year (int or smallint) 

Вторая таблица будет содержать подробную информацию. Мы можем отслеживать продажи определенного продукта, делая SELECT * FROM SalesPerMonth WHERE ProductId = xx

Но скажем, я хочу отображать эти данные, как если бы они не были нормализованы. Я хочу, чтобы плоская таблица продуктов X месяц/год показывала последние 8 месяцев. Что-то более или менее:

Prod  * Jan * Feb * Mar * Apr * May * Jun * Jul * Aug * 
----------------------------------------------------------------------------- 
Prod 1  * 500.00* 480.00* 470.00* 510.00* 555.00* 530.00* 440.00* 490.00* 
----------------------------------------------------------------------------- 
Prod 2  * 650.00* 680.00* 670.00* 710.00* 755.00* 630.00* 740.00* 820.00* 

Хорошо. Надеюсь, вы поняли эту идею. Мне нужно сгладить результирующую таблицу, и мне нужно передать ее таким образом моим пользователям. Как я могу это сделать? Заранее спасибо.

ответ

1

Начиная с SQL Server 2005 можно использовать PIVOT сделать это

В SQL Server 2000 можно использовать ряд сазе например

SELECT 
    SUM(CASE WHEN Month = 1 THEN Value ELSE 0 END) as Jan, 
    SUM(CASE WHEN Month = 2 THEN Value ELSE 0 END) as Feb, 

Если вам не нужны имена полей, вы можете использовать смещение от ввода.

DECLARE @CurrentMonth = @Input; 
DECLARE @CurrentMonth1 = @Input -1; 
DECLARE @CurrentMonth2 = @Input -2; 

, а затем сделать ваш SUM/СЛУЧАЙ розыгрыш

e.g. 
     SUM(CASE WHEN Month = @CurrentMonth THEN Value ELSE 0 END) as Month0, 
     SUM(CASE WHEN Month = @CurrentMonth1 THEN Value ELSE 0 END) as Month1, 

Затем на вашем дисплее (отчет/приложения) вы решить, что поместить в столбец заголовки

+0

Да, у меня есть. .. Я взгляну. –

+0

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

+0

Благодарим вас за помощь. В конце концов, после некоторых исследований я нашел эту замечательную статью (http://www.sommarskog.se/dynamic_sql.html) о динамическом SQL (потому что мне нужен динамический SQL, чтобы найти столбцы, которые мне нужны в моем Pivot) и эта фантастическая хранимая процедура (http://www.sommarskog.se/pivot_sp.sp), которая будет динамически находить нужные вам поля в вашем запросе и динамически размещать их в виде столбцов. –

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