繁体   English   中英

SQL:如何 select 其中一列与给定组内所有记录的另一列不匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM