2012-04-24 14 views
0

私はproductagegroupテーブルを持っています。SQLの場合

私はproductテーブルからagegroupテーブルとagegroupからidの一致にこれら2つのテーブルを結合しています。

私が使用しているクエリはここにあります。

WITH CTE_AgeGroup AS                    
       (
       SELECT p.agegroup, 
         CASE 
          WHEN AgeFromMonths >=0 AND AgeToMonths <= 24 
           THEN 
            CASE 
              WHEN AgeFromMonths >=0 AND AgeToMonths <= 3 THEN '0-3 Months' 
              WHEN AgeFromMonths >=3 AND AgeToMonths <= 6 THEN '3-6 Months' 
              WHEN AgeFromMonths >=6 AND AgeToMonths <= 9 THEN '6-9 Months' 
              WHEN AgeFromMonths >=9 AND AgeToMonths <= 12 THEN '9-12 Months' 
              WHEN AgeFromMonths >=12 AND AgeToMonths <= 18 THEN '12-18 Months' 
              WHEN AgeFromMonths >=18 AND AgeToMonths <= 24 THEN '18-24 Months' 
              END 
          END as 'age' 
       FROM agegroup a inner join product p on 
       a.id= p.agegroup 

       ), 
        CTE_AgeGroupResultSet AS 
       (
        select 
         Age, Count(*) AS CountAge from CTE_AgeGroup group by Age 
        ) 
       select * from CTE_AgeGroupResultSet order by age; 

しかし、私の問題は、製品A 'は0-3ヶ月にリストされている場合こと、および製品Bは、OMがリストされている「3〜6ヶ月、この2つの製品は、0〜「に記載されて取得されていません24ヶ月。

私は、製品AとBが何かアドバイスをいただければ幸い「0-24ヶ月

にも記載されているが取得されるように、私のクエリを変更したいです!

答えて

0

このケースの機能の理由はわかりません。 UNION演算子を使用する方が良いでしょう(これはちょうどあなたの製品とagegroupテーブルの両方の和集合をとる)

FULL OUTER JOINは(両方でNULL値がある場合でも、両方のテーブルを結合し、両方のテーブルからデータを取り出しテーブル)

+0

whenステートメントで使用されるラベルが私の必要とされる静的フィルターであったため、caseステートメントについては行っていません。それが理由です。 – user1352864

1

あなたは壮大な数を取得することにより、グループ内のwith rollupを使用することがあります:あなたはグループの説明を含むagegroupにvarchar列を追加する場合は、完全にケースを排除し、また

WITH CTE_AgeGroup AS 
(
    SELECT p.agegroup, 
      CASE WHEN AgeFromMonths >=0 AND AgeToMonths <= 24 
       THEN CASE WHEN AgeFromMonths >=0 AND AgeToMonths <= 3 
          THEN '0-3 Months' 
          WHEN AgeFromMonths >=3 AND AgeToMonths <= 6 
          THEN '3-6 Months' 
          WHEN AgeFromMonths >=6 AND AgeToMonths <= 9 
          THEN '6-9 Months' 
          WHEN AgeFromMonths >=9 AND AgeToMonths <= 12 
          THEN '9-12 Months' 
          WHEN AgeFromMonths >=12 AND AgeToMonths <= 18 
          THEN '12-18 Months' 
          WHEN AgeFromMonths >=18 AND AgeToMonths <= 24 
          THEN '18-24 Months' 
         END 
      END as 'age' 
    FROM agegroup a 
     inner join product p 
      on a.id= p.agegroup 
), 
CTE_AgeGroupResultSet AS 
(
    select case when grouping (Age) = 1 then '0-24' else Age end Age, 
      Count(*) AS CountAge 
     from CTE_AgeGroup 
    group by Age WITH ROLLUP 
) 
select * 
    from CTE_AgeGroupResultSet 
order by age; 

を。