Перекрестное применение / Соединение двух столбцов, когда левый столбец не отображается с правым столбцом - PullRequest
0 голосов
/ 06 ноября 2018

Вообразив, у меня есть следующая таблица:

Food served per month

Мы видим, что тунца не обслуживали в первый месяц. Я хотел бы, чтобы это появилось и в месяце 1.

Food server per month goal

Как мне этого добиться?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Если я понимаю, проблема в том, что у вас есть таблица без записи месяца для какого-либо вида пищи. Для меня лучший способ создать таблицу "month_of_year", которая будет содержать только число от 1 до 12.

, то:

выберите отдельную еду в #tmp из твоей_таблицы

выберите a.Food, month_of_year.month из #tmp кросс-присоединения month_of_year

drop table # tmp

тогда, если вы хотите, например, просмотреть общее количество продуктов за год, перейдите слева от последней таблицы, которую я написал, с таблицей суммы, и вы получите всю еду / месяц с итогом и в случай ноль на общее количество, где еда не была подана

Если вам нужна дополнительная информация, спросите =)

0 голосов
/ 06 ноября 2018

Вы можете попробовать использовать два подзапроса с DISTINCT и CROSS JOIN

SELECT *
FROM (SELECT DISTINCT Food FROM T) t1
CROSS JOIN (SELECT DISTINCT [Month] FROM T) t2

sqlfiddle

0 голосов
/ 06 ноября 2018

Вы можете использовать cross apply, чтобы давать каждую еду каждый месяц. Кажется, это то, что вы хотите.

declare @table table (Food varchar(16), [Month] int)
insert into @table
values
('Pizza',1),
('Burgers',1),
('Salad',1),
('Tuna',2),
('Pizza',2),
('Burgers',2),
('Salad',2)

select distinct
    f.Food
    ,m.Month
from @table f
cross apply (select distinct [Month] from @table) m
order by m.Month

Чтобы узнать, в какие месяцы Tuna не обслуживался в ...

select distinct [MONTH]
from @table
where [Month] not in (select [Month] from @table where Food = 'Tuna')
...