我有一个订单表,存储来自我们公司内多个站点的订单。在该表中,我们有字段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;这并不接近正确,但这是我所能想到的最接近的结果。任何帮助或指导都将非常感谢。
发布于 2012-07-17 00:59:17
您将需要一个HAVING子句来将聚合COUNT()与2进行比较,其中您已按userbid分组。确保在聚合COUNT()中使用DISTINCT,这样您就可以获得多个站点,而不仅仅是多个订单。
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-17 00:59:15
如果你只是寻找那些从多个网站订购的用户,你实际上不需要做self join。你只是需要这个。
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的Michael's point
DEMO
https://stackoverflow.com/questions/11508941
复制相似问题