选择与同一表格中另一个字段对应的每个不同字段

时间:2018-12-04 20:31:03

标签: mysql count row distinct

我从一个表中提取数据时遇到问题。

假设我有一个像这样的表:

t_stat的列:statId,userId,国家/地区,installerId,日期。

带有值,例如:

1, 1, Belgium, 1, 2014-04-06 18:19:03 ||
2, 2, Germany, 2, 2013-05-07 18:19:03 ||
3, 3, Italy, 3, 2018-06-08 18:19:03

结果是我需要什么: 我需要选择每个不同的国家/地区,并计算每个日期的安装量。它应该像这样:9行

2014-04-06 18:19:03 Belgium 1
2014-04-06 18:19:03 Germany 0
2014-04-06 18:19:03 Italy 0

2013-05-07 18:19:03 Belgium 0
2013-05-07 18:19:03 Germany 1
2013-05-07 18:19:03 Italy 0

2018-06-08 18:19:03 Belgium 0
2018-06-08 18:19:03 Germany 0
2018-06-08 18:19:03 Italy 1

有什么办法解决吗?

1 个答案:

答案 0 :(得分:0)

如果您不需要零值的行,这是微不足道的。

  SELECT DATE(date) date, country, COUNT(*) n
    FROM inst
  GROUP BY DATE(date), country
  ORDER BY date, country

但是您确实需要它们。所以:

首先,您需要将(已规范化的)原始数据分成三个虚拟表以供参考。

此虚拟表为您提供了您的国家/地区。

  SELECT DISTINCT country FROM inst

这给您您的约会日期。

  SELECT DISTINCT DATE(date) date FROM inst

这可为您提供每个国家/地区在每个日期的运营次数。

  SELECT DATE(date) date, country, COUNT(*) n

然后,您需要将这三个虚拟表连接在一起。最后一个使用LEFT JOIN,因此不会抑制零值。并且,使用IFNULL来显示零而不是空。

SELECT  c.country, d.date, IFNULL(i.n,0) n
  FROM (
     SELECT DISTINCT country FROM inst
        ) c
  JOIN (
      SELECT DISTINCT DATE(date) date FROM inst
       ) d ON 1=1
  LEFT JOIN (
      SELECT DATE(date) date, country, COUNT(*) n
        FROM inst
      GROUP BY DATE(date), country
       ) i ON c.country = i.country AND d.date = i.date
 ORDER BY d.date, c.country

这是一个例子。 https://www.db-fiddle.com/f/vab5mvJepWn2YFLJ28kGxA/0