【问题标题】:T-SQL Group by with a where clause带有 where 子句的 T-SQL Group by
【发布时间】:2013-01-27 22:30:51
【问题描述】:
 Masterid    CC  CLA DES NLCLA   NLDES
 -------------------------------------
 53006141    CN  0   0   1       1
 53006141    US  1   1   1       1
 53006141    UK  1   1   0       0
 53006142    US  1   1   0       0
 53006142    UK  1   1   0       0
 53006143    CN  0   0   1       1
 53006143    US  1   1   0       0
 53006143    UK  1   1   0       0

从以上数据我需要产生

  • MasterIds 的列表,其中有 CC = USCC = CNNLCLA = 1NLDES = 1

输出应该是

53006141
53006143

MasterID 下必须同时包含 CN 和 US。

有人可以帮我在 SQL 中执行此操作吗?

【问题讨论】:

    标签: sql sql-server tsql group-by where-clause


    【解决方案1】:

    您可以通过添加WHERE 子句来实现此目的,该子句将返回带有USCN 的行:

    select distinct Masterid
    from yourtable
    where cc in ('US', 'CN')
      and NLCLA = 1
      AND NLDES = 1
    

    SQL Fiddle with Demo

    如果您希望结果同时包含CNUS,那么您可以使用:

    select Masterid
    from yourtable
    where cc in ('US', 'CN')
      and NLCLA = 1
      AND NLDES = 1
    group by masterid
    having count(distinct cc) = 2
    

    SQL Fiddle with Demo

    实现此目的的另一种方法是使用EXISTS 来获取具有USCN 的MasterId 列表。然后将其他过滤器放在WHERE 子句中而不是子查询中。

    select distinct masterid
    from yourtable t1
    where exists (select Masterid
                  from yourtable t2
                  where cc in ('US', 'CN')
                    and t1.masterid = t2.masterid
                  group by masterid
                  having count(distinct cc) = 2)
      and NLCLA = 1
      and NLDES = 1;
    

    SQL Fiddle with Demo

    【讨论】:

    • 如果还有一行呢
      53006144 CN 0 0 0 0
    • @LeBlues 如果还有一行是什么意思?在那种情况下,除了结果之外,你会怎么做?它将返回相同的结果——sqlfiddle.com/#!3/968a1/1
    • @LeBlues 如果该行存在,那么它满足WHERE 的条件,因此它也会返回该行
    • @LeBlues 看到我的编辑,它将只返回那些同时具有 USCN 的记录
    • 它不返回 53006143
    【解决方案2】:

    一种方法是使用CTE

    WITH CTE AS
    (
        SELECT Masterid,CC,CLA,DES,NLCLA,NLDES,
            RN = ROW_NUMBER() OVER (PARTITION BY Masterid ORDER BY Masterid)
        FROM dbo.Table
        WHERE   CC IN('US', 'CN')
        AND     NLCLA = 1
        AND     NLDES = 1
    )
    SELECT Masterid FROM CTE WHERE RN = 1
    

    Demo(感谢 bluefeet 提供小提琴数据)

    请注意,如果您想获取特定行,ROW_NUMBER 分区函数会很有帮助,例如每个 Masterid 始终是最新记录。但是由于您没有提供datetime 列,我只是通过Masterid 任意订购。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 2017-09-09
      • 1970-01-01
      • 2019-06-06
      • 2018-07-16
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多