【问题标题】:Questions on SQL count and Valuable Definition关于 SQL 计数和值定义的问题
【发布时间】:2022-11-16 13:34:18
【问题描述】:

请问下表中破门数是怎么算的? 我也想显示Block B的记录,但是我只能显示Block A的记录。

另外,如果我的选择表查询太长,但我会重复使用很多次。 如何定义对长选择查询有价值的值?

表:doorStatus

Door Block key_Number Broken
door1 A 001 Y
door2 A 001 Y
door3 A 002 Y
door4 B 013 N

除了结果:

Block key_number Count_Broken
A 001 2
A 002 1
B 013 0

谢谢您的帮助。

【问题讨论】:

    标签: mysql sql database oracle


    【解决方案1】:

    一种方法:按块和 key_number 分组,计算损坏的数量。

    -- prep data
    create table door_status (
        door        varchar(10),
        block       char(1),
        key_number  varchar(3),
        broken      char(1));
        
    insert into door_status
    values
    ('door1','A','001','Y'),
    ('door2','A','001','Y'),
    ('door3','A','002','Y'),
    ('door4','B','013','N');
    
    -- query
    select block,
           key_number,
           sum(case broken when 'Y' then 1 else 0 end) as count_broken
      from door_status
     group by 1,2;
    

    结果:

    block|key_number|count_broken|
    -----+----------+------------+
    A    |001       |           2|
    A    |002       |           1|
    B    |013       |           0|
    

    【讨论】:

      【解决方案2】:

      这只是 block 和 key_number 上的 GROUP BY 子句,以及 broken 值上的 CASECOUNT 仅限“Y”条目:

      SELECT block, key_number, 
      COUNT(CASE WHEN broken = 'Y' THEN 1 END) AS Count_Broken
      FROM doorStatus
      GROUP BY block, key_number;
      

      将根据您的示例数据产生此结果:

      Block key_number Count_Broken
      A 001 2
      A 002 1
      B 013 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多