0

私はテーブルを持っproductていagegroupます。

idfrom agegrouptable とagegroupfrom the tableの一致でこれら 2 つのテーブルを結合していproductます。

私が使用しているクエリはこちらです。

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 が「3 ~ 6 か月」にリストされている場合、これら 2 つの製品は「0 ~ 24 か月」にリストされないことです。

製品 A と B も「0 ~ 24 か月」にリストされるようにクエリを変更したい

4

2 に答える 2

1

group byでロールアップを使用して、総カウントを取得できます。

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;

また、グループの説明を含む agegroup に varchar 列を追加すると、大文字と小文字が完全に削除されます。

于 2012-04-24T09:14:39.883 に答える
0

なぜこのケース関数を使用するのかわかりません。UNION 演算子を使用することをお勧めします (これは、製品と年齢グループの両方のテーブルの和集合を取るだけです)。

FULL OUTER JOIN (両方のテーブルを結合し、両方のテーブルに NULL 値があっても両方のテーブルからデータを取得します。)

于 2012-04-24T05:57:18.220 に答える