-1

2 つのテーブルがあり、1 つは顧客情報を保持し、もう 1 つは顧客に対して行われた診断です。<5 >5 の診断数と、診断を受けた男性/女性の数を知りたいです。

表:

customers
**NAME**       **PID**      **BIRTH_DATE**    **SEX**
chris             1            1980-07-01        m
Jane              2            1977-10-05        f
Anna              3            1990-5-10         f
David             4            2008-1-10         m
Naomi             5            2009-10-20        f
juma              6            2010-10-15        m

**diagnosis**
**PID**      **date_done**       **diagnosis_code**
  1           2013-03-20           084
  1           2013-03-13           019
  2           2013-03-17           084
  5           2013-03-13           037
  3           2013-03-21           019
  4           2013-03-01           037

3月の<5>5の診断数と男女の診断数を出したい

                      Year         Gender     
**Diagnosis_code      <5   >5       male    female**
?                    ?     ?         ?        ?

前もって感謝します

4

2 に答える 2

1

あなたは何を意味するかを特定しませんでし<5>5が、私はあなたが年齢を意味していると仮定しています. その場合は、次を使用できます。

select diagnosis_code,
  sum(case when ageInYears <5 then 1 else 0 end) `<5`,
  sum(case when ageInYears >5 then 1 else 0 end) `>5`,
  sum(case when sex = 'm' then 1 else 0 end) male,
  sum(case when sex = 'f' then 1 else 0 end) female
from
(
  select d.diagnosis_code,
    FLOOR(DATEDIFF(d.date_done, c.BIRTH_DATE)/365.25) AS ageInYears,
    c.sex
  from diagnosis d
  inner join customers c
    on d.pid = c.pid
) src
group by diagnosis_code

デモで SQL Fiddle を参照してください

于 2013-04-18T11:12:01.613 に答える
1

ケースごとにグループ化できるので、これはうまくいくはずです。

SELECT CASE WHEN d.diagnosis_code <5 THEN '<5' ELSE '>5' END,
       c.sex,
       count(*)
FROM customers c
JOIN diagnosis d
  ON c.pid=d.pid
WHERE d.diagnosis_code<>5
  AND MONTH(d.date_done)=3
GROUP BY CASE WHEN d.diagnosis_code <5 THEN '<5' ELSE '>5' END,
         c.sex;

Sqlfiddle (診断テーブルに 2 つの行が追加されることに注意してください)。

于 2013-04-18T11:07:21.537 に答える