2011-06-30 6 views
7

私はこのステートメントをやり直そうとしていますが、役に立たないです。SQL SUMとCASEとDISTINCT

Program Males Females Arts MalesAverage 
--------------------------------------- 
Program 7  5  1 50.000000 

これに伴う問題は、4人の男性と3人の女性だけがあるということです、と私はtblActivitesを追加するとき、重複を与えるように思われるもの:

SELECT b.Program AS Program, 
    SUM(CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males,  
    SUM(CASE WHEN a.Gender LIKE 'F%' THEN 1 ELSE NULL END) AS Females, 
    SUM(CASE WHEN e.Activity LIKE 'Arts' THEN 1 ELSE NULL END) AS Arts, 
    AVG(CASE WHEN a.Gender LIKE 'M%' THEN CAST(f.Score AS DEC(10,2)) ELSE NULL END) 
AS MalesAverage 
FROM tblChildren a 
    LEFT JOIN tblInvolvement b ON b.ChildID = a.ChildID 
    LEFT JOIN tblActivities e ON e.ChildID = b.ChildID 
    LEFT JOIN tblScores f ON f.ChildID = b.ChildID 
WHERE b.Place = 'Location' 
    AND b.Program = 'Program' 
    AND b.Year = '2009-10' 
    AND f.Assessment LIKE '%Pre%Assessment%' 
    AND e.StudentID = b.StudentID 
GROUP BY Program 

今、私のような結果が得られます。私は、アクティビティテーブルに12個のChildIDがあることに気付きました。なぜなら、その子供たちは複数のアクティビティに縛られていたからです。

SELECT SUM(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males 

しかし、Males列の下では1を返したばかりです。どんな助けもありがとう。また、さらに明確にするために、テーブルはChildIDを介して一緒にキーイングされています。私は正しい情報を返すように助けてください。これが解決すれば、私の大量のリストが解決されます。私がたくさんのデータを持っているので、GROUP BYを避けることが望ましいです。

+0

@niktrs適切な結果が4になる必要がある場合でも、まだ男性が7人います。 – jnewkirk

+0

テーブルと結合の関係を確認してください。集計を使わずにクエリを実行し、結果が奇妙なものかどうかを確認します。 – niktrs

答えて

11

これは機能しますか?

COUNT(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN a.ChildID ELSE NULL END) AS Males 

私は全体的に参加し、私は本当に知らないスキーマについて多くの詳細を知らなくてもを行うには良い方法があると思います。

+0

正確に何を知っておく必要がありますか?私は実際に見ているよりも総称的な名前を付けることができます。これらはすでに実際のテーブル名ではないので一般的です。 – jnewkirk

+0

まずは、これらのテーブルの主キーは何ですか?しかし、私が与えたCOUNT式はあなたの直面する問題に対処すると思います。 –

+0

しかし、これは機能しますが、私はAVG集約関数の説明を必要とするかもしれませんが、私はあなたの助けを非常に感謝します。 – jnewkirk

0

ソースデータは表示されませんが、プログラムごとに1人あたり複数の行がある可能性があります。

あなたはGROUP BY Programプログラムごとに集約しますが、John Smithは、そのプログラムIDを持つ2つの列を持っていると言うならば、彼が二度MALEとしてカウントされます。

わかりやすいクエリを提供できるように、テーブル構造を示してください。理想的には、Person_IDのようなものにGROUP BYを使用して副選択からカウントを取得し、重複カウントを取得しないようにします。

+0

これは私が避けようとしていたものです。しかし、プログラムは問題ではありません。 「見て、アクティビティテーブルに12のChildIDがあることに気付きました。その理由は、子供が複数のアクティビティに縛られていたからです。私が述べたように、これは問題です。子供は2つの列を持つtblActivitiesに同一のChildIDを生成すると同時に複数のアクティビティに結びついています。 ChildIDとActivity。私はGROUP BYを避けようとしたいと思いますが、やむを得ないことがあれば、私はそれをすることができます。 – jnewkirk