web-dev-qa-db-ja.com

SELECT CASESQLのDISTINCTCOUNT

Case(一意の番号)、ISR(個別の安全性レポート-一意の番号)、およびYearsOldのフィールドを含むレポートの表があります。

ケースごとに複数のISRが存在する可能性があります。年齢層内のユニークなケースの数を数えたいです。

このSQLは、ISRの数をカウントします。

SELECT  
COUNT(CASE WHEN `YearsOld` = -2) THEN 1 END) `No Report`,
COUNT(CASE WHEN `YearsOld` BETWEEN 0 AND 5) THEN 1 END) `0 to 5`
COUNT(CASE WHEN `YearsOld` BETWEEN 6 AND 12) THEN 1 END) `6 to 12`
FROM `Demographics`

これらの年齢層のDISTINCTCasesをカウントするようにこれを変更する方法はありますか?

8
Steve Helgeson

「case」変数が一意である場合は、SQLCASE構文に個別のキーワードを直接入れることができます。

Count(distinct CASE when yearsold between 6 and 12 then case else null end)

このようにして、case変数の一意の値はそれぞれ1回だけカウントされます。

列の命名に関する注意事項ですが、選択肢がある場合は、SQLで意味のあるWordを使用しないことをお勧めします(つまり、caseの代わりに 'case_num'を使用します)。

9
davesnitty

サブクエリを使用して、ケースごとに1つのYearsOldフィールドの人口統計テーブルをフィルタリングできますが、そのケースが異なるISRの年齢の違いに関連している可能性がある場合は、カウントされるだけです。 1つのブラケットで(おそらくこれはあなたが望むものですか?):

SELECT
  ... -- as you currently have
FROM (
  SELECT `Case`, `YearsOld` from `Demographics` GROUP BY `Case`
) t;

または、各括弧内の各「個別の」「ケース」を「カウント」するには、文字通り次のようにします。

SELECT
  COUNT(DISTINCT CASE WHEN `YearsOld` = -2 THEN 1 END) `No Report`,
  COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 0 AND  5 THEN `Case` END) `0 to 5`,
  COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 6 AND 12 THEN `Case` END) `6 to 12`
FROM Demographics;
4
eggyal