【问题标题】:SQL - Count Entries from multiple tablesSQL - 计算来自多个表的条目
【发布时间】:2017-03-15 21:24:59
【问题描述】:

我有以下表格:

Table A:
+--------+
| name   |
+--------+
|  name1 |
|  name2 |
|  name3 |
+--------+

Table B:
+--------+----------+
| name   | someB    | 
+--------+----------+
|  name1 |    dorem |
|  name1 |    lorem |
|  name3 |    ipsum |
+--------+----------+

Table C:
+--------+----------+
| name   | someC    | 
+--------+----------+
|  name1 |    dorem |
|  name2 |    lorem |
|  name2 |    ipsum |
+--------+----------+

SQL 会如何计算每个 name 底部两个表中的条目?

结果应该是这样的:

+--------+----+----+
| name   | A  | B  | 
+--------+----+----+
|  name1 |  2 |  1 |
|  name2 |  0 |  2 |
|  name3 |  1 |  0 |
+--------+----+----+

【问题讨论】:

    标签: sql database db2


    【解决方案1】:

    您可以在 SELECT 子句中使用相关子查询:

    select name,
        (select count(*) from table2 t2 where t2.name = t1.name) as A,
        (select count(*) from table3 t3 where t3.name = t1.name) as B
    from table1 t1
    

    【讨论】:

      【解决方案2】:

      首先,您的数据结构有问题。如果第一个表的名称具有唯一 id,则应在后续表中使用。

      但无论如何,您要在两个表中都有name 来进行计数。你可以使用union allgroup by

      select name, sum(a) as a, sum(b) as b
      from ((select name, 1 as a, 0 as b from t2) union all
            (select name, 0, 1 from t3)
           ) t
      group by name;
      

      【讨论】:

      • 对于初学者来说,非规范化的描述不会很有说服力。我是否可以建议更详细地说明您在后续表格中使用唯一 ID 的含义,以及为什么这很重要,不这样做的陷阱是什么?
      【解决方案3】:

      试试这个:

      SELECT C.name, COUNT(A.name),     COUNT(B.Name) 
         FROM C
         LEFT JOIN A ON C.name = A.name
         LEFT JOIN B ON C.name = B.name
         GROUP BY C.name
      

      【讨论】:

        【解决方案4】:
        select A.Name, B2.Nb as A, C2.Nb as B
        
        from A
        
        inner join lateral 
        (
        select count(*) Nb from B where B.Name=A.Name
        ) B2 on 1=1
        
        inner join lateral 
        (
        select count(*) Nb from C where C.Name=A.Name
        ) C2 on 1=1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多