如何比较按一列分组的 SQL 中的列值?

Posted

技术标签:

【中文标题】如何比较按一列分组的 SQL 中的列值?【英文标题】:How to compare column values in SQL grouped by one column? 【发布时间】:2019-07-23 20:27:23 【问题描述】:

我正在从汽车数据库练习 SQL,我有以下 CAR 表/视图,我需要选择比发动机/摩托车销售更多汽车的品牌。这意味着我必须选择只有 CAR 类型的 UNIT_SOLD 大于 ENGINE OR MOTORCYCLE 的值的行。

BRAND  UNIT_SOLD    TYPE
ACURA   1     MOTORCYCLE
CHEVY   3     ENGINE
CHEVY   1     CAR
DODGE   1     ENGINE
FORD    1     MOTORCYCLE
FORD    1     ENGINE
FORD    3     CAR
NISSAN  1     MOTORCYLE
NISSAN  1     ENGINE
NISSAN  2     CAR
TOYOTA  1     MOTORCYCLE
TOYOTA  3     CAR
VOLVO   3     MOTORCYCLE
VW  2     CAR

例如,在前面的例子中我必须返回:

FORD
NISSAN
TOYOTA
VW

解释:以前的品牌销售的汽车多于发动机/摩托车。 CHEVY 不考虑,因为他们销售 3 台发动机和 1 辆汽车。

我一直在尝试使用条件 SELECT 语句来解决这个问题,但是我不知道这是否是一个好方法。

非常感谢。

SELECT BRAND
 FROM CARS A
WHERE A.TYPE = 'CAR'
 AND A.UNIT_SELLS > (SELECT B.UNIT_SELLS FROM CARS B WHERE B.TYPE = 'ENGINE' AND A.MAKER=B.MAKER)
 OR  A.UNIT_SELLS > (SELECT B.UNIT_SELLS FROM CARS B WHERE B.TYPE = 'MOTORCYCLE' AND A.BRAND=B.BRAND);

SELECT BRAND
 FROM CARS A
WHERE A.TYPE = 'CAR'
 AND A.UNIT_SELLS > (SELECT B.UNIT_SELLS FROM CARS B WHERE B.TYPE = 'ENGINE' AND A.MAKER=B.MAKER)
 OR  A.UNIT_SELLS > (SELECT B.UNIT_SELLS FROM CARS B WHERE B.TYPE = 'MOTORCYCLE' AND A.BRAND=B.BRAND);

目前我能够获得 CAR unit_sold 更大的行,但是我仍然无法获得销售任何数量的汽车并且他们没有出售任何摩托车/发动机的行。

【问题讨论】:

【参考方案1】:

使用条件聚合,您可以获得每个总数并进行比较。

SQL DEMO

 SELECT brand,
        -- just for debug
        SUM(CASE WHEN TYPE = 'CAR'    THEN UNIT_SOLD ELSE 0 END) as total_cars,
        SUM(CASE WHEN TYPE = 'ENGINE' THEN UNIT_SOLD ELSE 0 END) as total_engines,
        SUM(CASE WHEN TYPE = 'MOTORCYCLE' THEN UNIT_SOLD ELSE 0 END) as total_motorcycles
 FROM cars
 GROUP BY brand
 HAVING SUM(CASE WHEN TYPE = 'CAR'    THEN UNIT_SOLD ELSE 0 END) >
        SUM(CASE WHEN TYPE = 'ENGINE' THEN UNIT_SOLD ELSE 0 END) 

    AND SUM(CASE WHEN TYPE = 'CAR'        THEN UNIT_SOLD ELSE 0 END) >
        SUM(CASE WHEN TYPE = 'MOTORCYCLE' THEN UNIT_SOLD ELSE 0 END) 

输出

|  brand | total_cars | total_engines | total_motorcycles |
|--------|------------|---------------|-------------------|
|   FORD |          3 |             1 |                 1 |
| NISSAN |          2 |             1 |                 0 |
| TOYOTA |          3 |             0 |                 1 |
|     VW |          2 |             0 |                 0 |

【讨论】:

以上是关于如何比较按一列分组的 SQL 中的列值?的主要内容,如果未能解决你的问题,请参考以下文章

如何按一列的最大值获取SQL行,按另一列分组

对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和

如何按id python按一列顺序对两列进行分组[重复]

sql语句 按一列分组 然后再按别一列组内排序?

如何按一列分组并对另一列的值进行排序?

如何在此 DataTable 上按一列分组