Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个包含季度和没有';本季度没有订单-MySQL?_Mysql_Database_Group By - Fatal编程技术网

如何创建一个包含季度和没有';本季度没有订单-MySQL?

如何创建一个包含季度和没有';本季度没有订单-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

我的表基本上是AdventureWorks示例数据库中的销售历史表,基本上是
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!请将此答案或任何其他答案标记为已接受,如果它确实帮助您解决问题。