如何创建一个包含季度和没有';本季度没有订单-MySQL?
我的表基本上是AdventureWorks示例数据库中的销售历史表,基本上是如何创建一个包含季度和没有';本季度没有订单-MySQL?,mysql,database,group-by,Mysql,Database,Group By,我的表基本上是AdventureWorks示例数据库中的销售历史表,基本上是salesorderheader(CustomerID、OrderDate等)。我想找出那些没有在每个季度下订单的客户,我想知道他们没有在哪个季度下订单。我可以用UNION子句以以下繁琐的方式得到答案: select distinct CustomerID, 1 as quarter from salesorderheader where CustomerID not in (select distinct Custom
salesorderheader(CustomerID、OrderDate等)
。我想找出那些没有在每个季度下订单的客户,我想知道他们没有在哪个季度下订单。我可以用UNION
子句以以下繁琐的方式得到答案:
select distinct CustomerID, 1 as quarter
from salesorderheader
where CustomerID not in (select distinct CustomerID
from salesorderheader
where quarter(OrderDate) = 1)
union
select distinct CustomerID, 2 as quarter
from salesorderheader
where CustomerID not in (select distinct CustomerID
from salesorderheader
where quarter(OrderDate) = 2)
union
select distinct CustomerID, 3 as quarter
from salesorderheader
where CustomerID not in (select distinct CustomerID
from salesorderheader
where quarter(OrderDate) = 3)
union
select distinct CustomerID, 4 as quarter
from salesorderheader
where CustomerID not in (select distinct CustomerID
from salesorderheader
where quarter(OrderDate) = 4)
order by CustomerID, quarter;
我可以得到这样的桌子:
CustomerID, quarter
19, 1
19, 3
19, 4
26, 3
31, 1
我想知道是否有更好的方法来执行此操作?您可以使用以下查询:
SELECT t2.CustomerID, t1.`Quarter`
FROM (
SELECT 1 AS `Quarter` UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4
) AS t1
CROSS JOIN (
SELECT DISTINCT CustomerID
FROM salesorderheader
) AS t2
LEFT JOIN (
SELECT CustomerID, QUARTER(OrderDate) AS `Quarter`
FROM salesorderheader
) AS t3 ON t2.CustomerID = t3.CustomerID
AND t1.`Quarter` = t3.`Quarter`
WHERE t3.`Quarter` IS NULL
ORDER BY t2.CustomerID
派生表的交叉联接本质上创建了一个包含所有可能的季度和客户ID组合的表
如果我们使用原始表执行此表的左联接
,即salesorderheader
,我们可以使用t3.Quarter为空
谓词轻松找到缺少的组合
您可以使用以下查询:
SELECT t2.CustomerID, t1.`Quarter`
FROM (
SELECT 1 AS `Quarter` UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4
) AS t1
CROSS JOIN (
SELECT DISTINCT CustomerID
FROM salesorderheader
) AS t2
LEFT JOIN (
SELECT CustomerID, QUARTER(OrderDate) AS `Quarter`
FROM salesorderheader
) AS t3 ON t2.CustomerID = t3.CustomerID
AND t1.`Quarter` = t3.`Quarter`
WHERE t3.`Quarter` IS NULL
ORDER BY t2.CustomerID
派生表的交叉联接本质上创建了一个包含所有可能的季度和客户ID组合的表
如果我们使用原始表执行此表的左联接
,即salesorderheader
,我们可以使用t3.Quarter为空
谓词轻松找到缺少的组合
谢谢你,乔治!我有一个类似的想法,但没有像您所发布的那样提出交叉连接解决方案。@user5349118很高兴我能够提供帮助并欢迎使用Stackoverflow!请将此答案或任何其他答案标记为已接受,如果它确实帮助您解决问题。谢谢您,Giorgos!我有一个类似的想法,但没有像您所发布的那样提出交叉连接解决方案。@user5349118很高兴我能够提供帮助并欢迎使用Stackoverflow!请将此答案或任何其他答案标记为已接受,如果它确实帮助您解决问题。