【问题标题】:SQL conditional GROUP BY: how to do it?SQL条件GROUP BY:怎么做?
【发布时间】:2009-09-11 11:54:02
【问题描述】:

假设我有以下 SQL 查询:

SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting 
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id

输出如下:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     d    |     1
     e    |     1
     f    |     2
     g    |     2

我想要以下输出,按不为 NULL 的 billId 分组:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     f    |     2

我怎样才能做到这一点?顺便说一句,我不关心分组结果的模糊会议ID。

感谢您的帮助!

【问题讨论】:

    标签: sql mysql group-by


    【解决方案1】:

    SQL Server:

    SELECT  meetingId, billid
    FROM    (
            SELECT  ROW_NUMBER() OVER (PARTITION BY billId ORDER BY meetingID) AS rn,
                    m.*
            FROM    mytable m
            ) q
    WHERE   rn = 1 OR billid IS NULL
    

    ANSI:

    SELECT  MIN(meetingId), billid
    FROM    mytable
    WHERE   billid IS NOT NULL
    GROUP BY
            billId
    UNION ALL
    SELECT  meetingId, billId
    FROM    mytable
    WHERE   billid IS NULL
    

    MySQL:

    SELECT  meetingId, billid
    FROM    mytable
    WHERE   billid IS NOT NULL
    GROUP BY
            billId
    UNION ALL
    SELECT  meetingId, billId
    FROM    mytable
    WHERE   billid IS NULL
    

    如果你真的不关心meetingID 属于正确的组,那么这比MIN 更有效。

    【讨论】:

    • 您需要在 group by 子句中进行非空检查
    • 您可能还想指定 row_number() 是 SQL 2005。
    • 感谢您的帮助!这正是我想要的。
    【解决方案2】:

    您可以合并 2 个查询,其中一个执行非空条目中的组,另一个获取空条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2021-02-04
      相关资源
      最近更新 更多