【问题标题】:SQL multiple where and fieldsSQL 多个 where 和字段
【发布时间】:2013-08-29 09:23:34
【问题描述】:

我目前将数据组织在 2 个表中,如下所示:

会议
见面ID
满足类别

订单
order_id
见面ID
订单日期

我需要编写一个查询来返回会议总数、类别为“长”的会议数量和类别为“短”的会议数量。 仅计算在 2011 年 3 月 1 日之后至少有一个 order_date 的会议。

输出应该在 3 个字段和 1 行中

到目前为止,我所拥有的是:

SELECT COUNT(m.meet_id),
COUNT(SELECT m.meet_id WHERE m.meet_category = 'long'),
COUNT(SELECT m.meet_id WHERE m.meet_category = 'short')
FROM Meetings m
INNER JOIN Orders o
ON m.meet_id = o.meet_id 
WHERE o.order_date >= '2011-03-01'; 

这是首先想到的,但是这个查询不起作用,我什至不确定我的方法是否正确。所有帮助表示赞赏!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个:

    SELECT COUNT(m.meet_id),
    SUM(CASE WHEN m.meet_category = 'long' THEN 1 ELSE 0 END),
    SUM(CASE WHEN m.meet_category = 'short' THEN 1 ELSE 0 END)
    FROM Meetings m where  meet_id in 
        (select meet_id
        FROM Orders o
        WHERE o.order_date >= '2011-03-01'); 
    

    【讨论】:

    • 注意,这个查询只对MySql有效,因为meet_category不包含在group by子句中
    【解决方案2】:

    试试这个

    select count(1) as total_count,innerqry.*
    
    (
    select count(m.meet_id), meet_catagory
    Meetings m
    INNER JOIN Orders o
    ON m.meet_id = o.meet_id 
    and m.meet_id in 
    (select meet_id from orders where order_date>= '2011-03-01')
    
    group by meet_category
    ) innerqry
    

    如果您只想要一排并且您知道的会议类型很少,请试试这个

    SELECT COUNT(m.meet_id),
    SUM(CASE WHEN m.meet_category = 'long' THEN 1 ELSE 0 END),
    SUM(CASE WHEN m.meet_category = 'short' THEN 1 ELSE 0 END)
    FROM Meetings m
    INNER JOIN Orders o
    ON m.meet_id = o.meet_id 
    WHERE  m.meet_id in 
    (select meet_id from orders where order_date>'2011-03-01')
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT COUNT(m.meet_id),
      (select count(*) from meetings m2 join orders o2 on o2.meet_id = m2.meet_id where m2.meet_category = 'long' and o2.order_date >= '2011-03-01'),
      (select count(*) from meetings m2 join orders o2 on o2.meet_id = m2.meet_id where m2.meet_category = 'short' and o2.order_date >= '2011-03-01')
      FROM mettings m
      INNER JOIN Orders o
      ON m.meet_id = o.meet_id
      WHERE o.order_date >= '2011-03-01';
      

      您必须实现两个独立的子查询,因为您希望主查询中的总数不按 meet_id 分组,因此如果您尝试将子查询与主查询中的字段链接,您会遇到按字段分组的错误。

      【讨论】:

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