【问题标题】:SQL: combining a total count along with a conditional countSQL:结合总计数和条件计数
【发布时间】:2020-02-19 16:28:59
【问题描述】:

我想返回一家酒店的客房总数,并提供该酒店拥有超过 2 间卧室的客房总数。我的代码返回每家酒店中超过 2 间卧室的房间总数,但它不返回酒店中的房间总数。相反,它只返回超过 2 间卧室的房间总数。

有没有一种简单的方法来修改我的代码来解决这个问题?

我有以下代码:

SELECT
    hotel.hotel_id,
    hotel.hotel_name,
    COUNT(room.room_no) || ' total rooms ' || COUNT(room.room_no) 
    || ' have more than 2 bedrooms ' AS ACCOMODATION_AVAILABLE
FROM
    hotel
INNER JOIN
    room
ON
    hotel.hotel_id = room.hotel_id
WHERE
    room_bedrooms > 2
GROUP BY
    hotel.hotel_id, hotel.hotel_name;

【问题讨论】:

    标签: sql string oracle count pivot


    【解决方案1】:

    使用条件聚合:

    SELECT h.hotel_id, h.hotel_name,
           COUNT(*) as total_roms,
           SUM(CASE WHEN r.room_bedrooms > 2 THEN 1 ELSE 0 END) as num_3plus
    FROM hotel h JOIN
         room r
         ON h.hotel_id = r.hotel_id
    GROUP BY h.hotel_id, h.hotel_name;
    

    我会让你构造字符串。这些信息在单独的列中似乎更有用。

    注意表别名的使用。这使查询更易于编写和阅读。

    【讨论】:

      【解决方案2】:

      你可以做条件聚合:

      SELECT
          h.hotel_id,
          h.hotel_name,
          COUNT(r.room_no) || ' total rooms ' 
              || SUM(CASE WHEN r.room_no > 2 THEN 1 ELSE 0 END) 
              || ' have more than 2 bedrooms ' AS ACCOMODATION_AVAILABLE
      FROM hotel h
      INNER JOIN room r ON h.hotel_id = r.hotel_id
      GROUP BY h.hotel_id, h.hotel_name;
      

      注意:表别名使查询更短且更易于理解。我修改了您的查询以使用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2021-09-06
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多