0

とにかく、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

4 に答える 4

1

クエリを別のクエリにラップできます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')
于 2012-08-07T13:59:46.633 に答える
1

あなたが望む論理は何ですか?

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'

しかし、これでも奇妙に思えます。なぜ「子供」を数えているのですか。何をグループ化していますか?子がデータの単なるフィールドである場合、これはHAVING句ではなくWHERE句である必要があります。

where (nationality = 'Mexican' and children end > 3) or
      (nationality = 'American' and children = 2) or
      (nationality = 'Japanese' and children = 1)
于 2012-08-07T14:01:42.030 に答える
0

既存のクエリをCTEでラップして、カウントとグループ化をフィルタリングから分離し、最後のWHERE句でCTEからのカウントをCASEで使用できます。

;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
    )
于 2012-08-07T13:58:44.290 に答える
0

これは機能する必要があります

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
    )
于 2012-08-07T16:22:15.140 に答える