首页 文章

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

提问于
浏览
0

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

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

t_stat包含列:statId,userId,country,installerId,date .

以值为例:

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

    如果您不需要具有零值的行,则这是微不足道的 .

    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

相关问题