2

我有一个订单表,用于存储来自我们公司内多个站点的订单。在表中,我们有字段 userid、ordernumber 和 sitename。我希望能够获得从我们的 2 个或更多站点订购的用户数量。

这是我开始的:

SELECT
  o.ordernumber,
  o.sitename,
  o.userdbid,
  o2.sitename,
  o2.userdbid,
  o2.ordernumber
FROM
  orders o
INNER JOIN
  orders o2
ON
  o.userdbid = o2.userdbid
WHERE
  o.sitename != o2.sitename
ORDER BY
  o.userdbid;

这并不接近正确,但这是我能想到的。任何帮助或指导将不胜感激。

4

2 回答 2

4

您将需要一个HAVING子句将聚合COUNT()与 2 进行比较,其中您已按userbid. 请务必DISTINCT在您的聚合中使用,COUNT()以便您获得多个站点而不仅仅是多个订单。

SELECT
  o.userbid,
  COUNT(DISTINCT o.sitename) AS num_order_sites
FROM
  orders o
GROUP BY o.userbid
HAVING COUNT(DISTINCT o.sitename) >= 2
于 2012-07-16T16:59:16.870 回答
1

如果您只寻找从多个站点订购的用户,您实际上不需要进行自我加入。你只需要这个。

SELECT
  o.userdbid
FROM
  orders o
GROUP BY o.userdbid
HAVING 
    COUNT(o.sitename) > 1

如果您想找到其他信息,您可以加入这些结果。

例如

SELECT 
     o.ordernumber,
     o.sitename,
     o.userdbid
FROM   orders o 
   INNER JOIN (SELECT o.userdbid 
               FROM   orders o 
               GROUP  BY o.userdbid 
               HAVING Count( DISTINCT o.sitename) > 1) morethanOne 
           ON o.userdbid = morethanone.o.userdbid 

更新:请注意迈克尔关于 DISTINCT的观点

演示

于 2012-07-16T16:59:15.063 回答