SQL:如何为给定组中的所有记录选择一列与另一列不匹配的位置



我在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

这是一个Fiddle:http://www.sqlfiddle.com/#!17/145ff/3

我想返回在国际上运送ALL其产品的公司列表(即,对于特定companyALL记录manufactured列中的值与shipped列中的数值不同)。

使用上面的例子,期望的结果集是:

company
Toyota
Audi

这是我的尝试:

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<gt;小提琴

问题中链接的fiddle是Postgres数据库,但MySQL被称为DBMS。

在MySQL数据库中,上述查询可以简化为:

SELECT company
FROM sales
GROUP BY company
HAVING SUM(manufactured = shipped) = 0;

在Postgres数据库中,这是不可能的。

你必须集中思考。。。你想显示没有匹配项的所有内容--查找匹配项显示其余

SELECT DISTINCT company 
FROM sales
WHERE company NOT IN (
SELECT company 
FROM sales 
WHERE  manufactured = shipped
)

最新更新