当左列不与右列一起出现时交叉应用/连接两列
Cross apply / Joining two column when left column does not appear with right column
假设我有以下 table:
我们可以看到第 1 个月没有供应金枪鱼。
我想让它也出现在第 1 个月。
我怎样才能做到这一点?
谢谢!
你可以用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')
据我了解,问题是您 table 没有某种食物的月份记录。
对我来说,最好的方法是创建一个 table "month_of_year",它只包含从 1 到 12 的数字。
然后:
select 不同的食物
进入#tmp
来自 your_table
select a.Food, month_of_year.month
来自 #tmp 交叉连接 month_of_year
下降 table #tmp
然后,例如,如果你想查看一年中的食物总数,请从我写的最后一个 table 的左边开始,用总和的 table ,你将有所有 food/month 与总数,如果没有提供食物的总数为空
如果您需要更多信息,请询问 =)
您可以尝试使用 DISTINCT
和 CROSS JOIN
两个子查询
SELECT *
FROM (SELECT DISTINCT Food FROM T) t1
CROSS JOIN (SELECT DISTINCT [Month] FROM T) t2
假设我有以下 table:
我们可以看到第 1 个月没有供应金枪鱼。 我想让它也出现在第 1 个月。
我怎样才能做到这一点?
谢谢!
你可以用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')
据我了解,问题是您 table 没有某种食物的月份记录。 对我来说,最好的方法是创建一个 table "month_of_year",它只包含从 1 到 12 的数字。
然后:
select 不同的食物 进入#tmp 来自 your_table
select a.Food, month_of_year.month 来自 #tmp 交叉连接 month_of_year
下降 table #tmp
然后,例如,如果你想查看一年中的食物总数,请从我写的最后一个 table 的左边开始,用总和的 table ,你将有所有 food/month 与总数,如果没有提供食物的总数为空
如果您需要更多信息,请询问 =)
您可以尝试使用 DISTINCT
和 CROSS JOIN
SELECT *
FROM (SELECT DISTINCT Food FROM T) t1
CROSS JOIN (SELECT DISTINCT [Month] FROM T) t2