【问题标题】:Return groupings where at least one row per group satisfies a condition SQL server返回分组,其中每组至少有一行满足条件 SQL 服务器
【发布时间】:2017-06-20 22:41:14
【问题描述】:

我有一个包含多个列的表(我们称之为TableA),Id 是唯一的 id 列。

我只对三个感兴趣:A (int)、B (int)、C (varchar)。

最初我想选择共享相同 AB 的行并返回至少 2 行。

; WITH CTE AS (
    SELECT      tbl.A, tbl.B
    FROM        [dbo].[TableA] tbl
    /* WHERE irrelevant filter here */
    GROUP BY    tbl.A, tbl.B
    HAVING      COUNT(1) > 1
)

从现在开始,我想返回此 CTE 中标识的分组,其中每个分组中至少有一行将 C 列设置为 'ThisValue'

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用 sum with case 来统计有 'ThisValue' 的记录

    ; WITH CTE AS (
        SELECT      tbl.A, tbl.B
        FROM        [dbo].[TableA] tbl
        /* WHERE irrelevant filter here */
        GROUP BY    tbl.A, tbl.B
        HAVING      COUNT(1) > 1 and sum(case tbl.C when 'ThisValue' then 1 else 0 end)>0
    )
    

    【讨论】:

      【解决方案2】:

      例如,您可以使用 EXISTS 运算符。

      ; WITH CTE AS (
          SELECT      tbl.A, tbl.B
          FROM        [dbo].[TableA] tbl
          /* WHERE irrelevant filter here */
          GROUP BY    tbl.A, tbl.B
          HAVING      COUNT(1) > 1
      )
      SELECT * FROM CTE
      WHERE EXISTS (SELECT 1 FROM [dbo].[TableA] tc 
      WHERE tc.A=CTE.A AND tc.B=CTE.B AND tc.C='ThisValue');
      

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多