【问题标题】:count and list group of results by city按城市计数和列出结果组
【发布时间】:2016-06-06 10:26:58
【问题描述】:

我对 sql 很陌生,这似乎暂时超出了我的技能范围。

我需要从 2 个连接的表中创建以下列表:

城市 |总结果 |结果 = A 或 B |结果 = C 或 D 或 E |结果 = F 城市1 | 10 | 3 | 5 | 2 城市2 | 3 | 2 | 0 | 1

表格结构为:

Tbl1:id(主要)、城市、结果 Tbl2:代码(主要)、时刻、状态 表的连接很容易: select * from Tbl1 t1 join Tbl2 t2 on t1.id=t2.code

我首先尝试了嵌套选择,但我不能或不知道如何匹配 2 个条件,城市 +“结果 = A 或 B”,除非我指定特定城市并且在这种情况下无法创建所有城市的列表。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以进行条件求和。由于您没有提供任何示例数据,以下是您应该能够在您的案例中采用和使用的示例:

    with sample_data as (select 1 id, 'a' val1, 10 val2 from dual union all
                         select 1 id, 'a' val1, 20 val2 from dual union all
                         select 1 id, 'b' val1, 30 val2 from dual union all
                         select 1 id, 'b' val1, 40 val2 from dual union all
                         select 1 id, 'c' val1, 50 val2 from dual union all
                         select 1 id, 'd' val1, 60 val2 from dual union all
                         select 1 id, 'e' val1, 70 val2 from dual union all
                         select 2 id, 'a' val1, 100 val2 from dual union all
                         select 2 id, 'b' val1, 200 val2 from dual union all
                         select 2 id, 'b' val1, 300 val2 from dual union all
                         select 2 id, 'c' val1, 400 val2 from dual union all
                         select 2 id, 'd' val1, 500 val2 from dual union all
                         select 2 id, 'd' val1, 600 val2 from dual union all
                         select 2 id, 'e' val1, 700 val2 from dual)
    -- end of creating a subquery that mimics a table called sample_data with data in it.
    select   id,
             count(*) total,
             count(case when val1 in ('a', 'b') then 1 end) total_a_b,
             count(case when val1 in ('c', 'd') then 1 end) total_c_d
    from     sample_data
    group by id;
    
            ID      TOTAL  TOTAL_A_B  TOTAL_C_D
    ---------- ---------- ---------- ----------
             1          7          4          2
             2          7          3          3
    

    【讨论】:

      【解决方案2】:

      您可能需要条件聚合:

      SELECT CITY,
             SUM(1) AS TotalResult,
             SUM(
                 CASE WHEN RESULT IN ('A', 'B')
                     THEN 1
                     ELSE 0
                 END) AS "Result= A or B",
             SUM(
                 CASE
                     WHEN RESULT IN ('C', 'D', 'E')
                     THEN 1
                     ELSE 0
                 END
                )
                 AS "Result= C or D or E",
             SUM(
                 CASE
                     WHEN RESULT = 'F'
                     THEN 1
                     ELSE 0
                 END
                ) AS "Result= F"
        FROM Tbl1 t1 JOIN Tbl2 t2 ON t1.id = t2.code
        GROUP BY CITY
      

      这在GROUP BY 子句中使用CITY,因此为CITY 的每个值提供一行;在同一行上,它使用CASE 仅在匹配某些条件时才计算该行。

      【讨论】:

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