Вот пример:
create table #months (value int, name varchar(12))
create table #items (value int, name varchar(24))
create table #sales (month int, item int, sales int)
insert into #months values (1, 'jan')
insert into #months values (2, 'feb')
insert into #months values (3, 'mar')
insert into #items values (1, 'apple')
insert into #items values (2, 'pear')
insert into #items values (3, 'nut')
insert into #sales values (1,1,12)
insert into #sales values (2,2,3)
insert into #sales values (2,2,5)
insert into #sales values (3,3,7)
Вы можете запросить его, используя таблицу PIVOT, например:
select *
from (
select
item = #items.name
, month = #months.name
, sales = isnull(sum(#sales.sales),0)
from #months
cross join #items
left join #sales on #months.value = #sales.month
and #items.value = #sales.item
group by #months.name, #items.name
) vw
pivot (sum(sales) for month in ([jan],[feb],[mar])) as PivotTable
Или, в качестве альтернативы, обычный запрос:
select
item = #items.name
, jan = sum(case when #sales.month = 1 then sales else 0 end)
, feb = sum(case when #sales.month = 2 then sales else 0 end)
, mar = sum(case when #sales.month = 3 then sales else 0 end)
from #items
left join #sales on #items.value = #sales.item
group by #items.name
Оба результата:
item jan feb mar
apple 12 0 0
nut 0 0 7
pear 0 8 0
В первом примере «перекрестное соединение» обеспечивает наличие всех месяцев и значений. Затем они «соединяются влево», поэтому отображаются даже строки без значений.
Функция IsNull () предназначена для отображения 0 вместо NULL в течение месяца, в течение которого данный конкретный элемент не был продан.