【问题标题】:How to include values with count 0?如何包含计数为 0 的值?
【发布时间】:2021-11-11 15:35:45
【问题描述】:

我有一张名为 Trains 的表格。

id | name | train_id
 1   Carl      1
 2   Kat       1
 3   Paul      2
 4   Adam      4
 5   Janet     4
 6   James     4

我试图为每个名字计算同一列火车上还有多少人。

这是我目前得到的:

SELECT T1.name, COUNT(T2.name)
FROM Trains T1, Trains T2
WHERE T1.name<>T2.name AND T1.train_id=T2.train_id
GROUP BY T1.name;

但是,我得到的结果是

Janet  2
Adam   2
Kat    1
Carl   1
James  2

但我也应该在此处使用计数为 0 的名称“Paul”。我是 SQL 新手,我不确定如何更改我的代码以使此处也具有零值。

【问题讨论】:

    标签: sql count


    【解决方案1】:

    如果您将当前逻辑表述为左连接,它应该可以工作:

    SELECT t1.name, COUNT(t2.name) AS cnt
    FROM Trains t1
    LEFT JOIN Trains t2
        ON t1.name <> t2.name AND t1.train_id = t2.train_id
    GROUP BY t1.name;
    

    Demo

    您当前方法的问题在于它执行的是老式的隐式内部联接,而不是左联接。这意味着首先发生连接,然后WHERE 子句过滤掉丢失的 Paul 记录。通过使用左连接,连接左侧的所有名称都将保留。

    【讨论】:

      【解决方案2】:

      我认为不需要join。只需使用窗口函数:

      select name, count(*) over (partition by train_id) - 1
      from trains t;
      

      基本上,count(*) over (partition by train_id) 计算火车上的行数。 - 1 是减去当前行。

      【讨论】:

        【解决方案3】:

        我们使用 COUNT(*) 来计算组的所有输入行。

        (COUNT() 也适用于表达式,但行为略有不同。)

        以下是数据库执行此查询的方式:

        FROM train_id: — 首先,从 Trains 表中检索所有记录。

        GROUP BY name - 接下来,确定唯一名称组。

        SELECT ... - 最后,选择该组中的名称和行数。

        我们还使用 AS people_in_same_train 为该行数指定一个别名,以使输出更具可读性。

        选择 姓名,COUNT(*) AS people_in_same_train
        从火车 按名称分组;

        【讨论】:

          猜你喜欢
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-24
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2021-01-03
          相关资源
          最近更新 更多