代码之家  ›  专栏  ›  技术社区  ›  Lloyd Banks

如果有多于x的Then Where语句

  •  0
  • Lloyd Banks  · 技术社区  · 12 年前

    有没有HAVING和WHERE子句可以相互推测?即伪代码:

    CASE
       HAVING count(children) > 3 THEN WHERE nationality = 'Mexican'
       HAVING count(children) = 2 THEN WHERE nationality = 'American'
       HAVING count(children) = 1 THEN WHERE nationality = 'Japanese'
    END
    
    4 回复  |  直到 12 年前
        1
  •  1
  •   Taryn Frank Pearson    12 年前

    您可以将查询包装在另一个查询中 SELECT

    SELECT *
    FROM
    (
        SELECT count(children) as ChildrenCount, nationality 
        FROM yourTable
        GROUP BY nationality 
    ) x
    WHERE 
        (ChildrenCount > 3 AND nationality = 'Mexican')
        OR
        (ChildrenCount = 2 AND nationality = 'American')
        OR
        (ChildrenCount = 1 AND nationality = 'Japanese')
    
        2
  •  1
  •   Gordon Linoff    12 年前

    你想要的逻辑是什么?

    让我猜一下,你想要有3个以上孩子的墨西哥人,想要有2个孩子的美国人,想要有1个孩子的日本人。在这种情况下,您希望:

    having (case when count(nationality = 'Mexican' then children end) > 3 then 'true'
                 when count(nationality = 'American' then children end) = 2 then 'true'
                 when count(nationality = 'Japanese' then children end) = 1 then 'true'
            end) = 'true'
    

    然而,即便如此,这似乎也很奇怪。你为什么数“孩子”。你在分组什么?如果子项只是数据中的一个字段,那么它应该是WHERE子句,而不是HAVING子句:

    where (nationality = 'Mexican' and children end > 3) or
          (nationality = 'American' and children = 2) or
          (nationality = 'Japanese' and children = 1)
    
        3
  •  0
  •   Cᴏʀʏ bcherry    12 年前

    您可以将现有查询包装在CTE中,以将计数和分组与筛选分离,然后在带有CASE的最终WHERE子句中使用来自CTE的计数:

    ;WITH [Counts] AS
    (
        SELECT
            ,nationality
            ,COUNT(children) AS [children]
        FROM
            xyz
        GROUP BY
            nationality
    )
    SELECT
        *
    FROM
        [Counts]
    WHERE 
        nationality = 
        (
            CASE 
                WHEN [children] > 3 THEN 'Mexican'
                WHEN [children] = 2 THEN 'American'
                WHEN [children] = 1 THEN 'Japanese' 
            END
        )
    
        4
  •  0
  •   NG.    12 年前

    这应该有效

    DECLARE @table TABLE     
    (    
         nationality varchar (25),  
         totalchildren int
    )   
    
    insert @table  
        SELECT nationality,COUNT(children) AS totalchildren 
        FROM TABLENAME
        GROUP BY nationality
    
    SELECT
        *
    FROM
        @table  
    WHERE 
        nationality = 
        (
            CASE 
                WHEN totalchildren > 3 THEN 'Mexican'
                WHEN totalchildren = 2 THEN 'American'
                WHEN totalchildren = 1 THEN 'Japanese' 
            END
        )