![](/img/trans.png)
[英]Group records by UserID, select where on one column value and sum another
[英]SQL: how to select where one column does not match another column for ALL records within a given group
我在 MySQL 数据库中有一个名为sales
的表,如下所示:
company manufactured shipped
Mercedes Germany United States
Mercedes Germany Germany
Mercedes Germany United States
Toyota Japan Canada
Toyota Japan England
Audi Germany United States
Audi Germany France
Audi Germany Canada
Tesla United States Mexico
Tesla United States Canada
Tesla United States United States
这是一个小提琴: http://www.sqlfiddle.com/#!17/145ff/3
我想返回在国际范围内运送所有产品的公司列表(即manufactured
列中的值与特定company
的所有记录的shipped
列中的值不同)。
使用上面的示例,所需的结果集将是:
company
Toyota
Audi
这是我的(hackish)尝试:
WITH temp_table AS (
SELECT
s.company AS company
, SUM(CASE
WHEN s.manufactured != s.shipped THEN 1
ELSE 0
END
) AS count_international
, COUNT(s.company) AS total_within_company
FROM
sales s
GROUP BY
s.company
)
SELECT
company
FROM
temp_table
WHERE count_international = total_within_company
本质上,我计算列不匹配的实例。 然后我检查这些不匹配实例的总和是否与给定组中的记录数相匹配。
这种方法有效,但它远非一个优雅的解决方案!
任何人都可以提供有关实现此查询的更惯用方式的建议吗?
谢谢!
我们可以按公司GROUP BY
并使用HAVING
子句来表示shipped
的所有国家/地区必须与manufactured
国家/地区不同:
SELECT company
FROM sales
GROUP BY company
HAVING COUNT(CASE WHEN manufactured = shipped THEN 1 END) = 0;
在这里试试: db<>fiddle
问题中链接的小提琴是 Postgres 数据库,但 MySQL 被标记为 DBMS。
在 MySQL 数据库中,上述查询可以简化为:
SELECT company
FROM sales
GROUP BY company
HAVING SUM(manufactured = shipped) = 0;
在 Postgres 数据库中,这是不可能的。
你必须成套思考......你想显示所有没有匹配的 - 找到匹配显示 rest
SELECT DISTINCT company
FROM sales
WHERE company NOT IN (
SELECT company
FROM sales
WHERE manufactured = shipped
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.