GROUP BY
確かに、ここでこの質問を数回見たことがありますが、すべての回答は aまたは aを使用して問題を解決しているように見えるためWHERE
、クエリが大きくなりすぎた場合にこれを回避する方法に興味がありました。動作しません。
たとえば、メイン テーブルに 2 つの左結合を使用するものを作成して、結果にオーバーラップをもたらします。私はまだSQLに比較的慣れていないので、何が原因なのか正確にはわかりませんが、カウントを実行すると、さらに1000人ほどの人が増えていることはわかっています。私が参加している 2 つのテーブルには、(意図的に) 各人の ID が重複しているため、これが当てはまると想像しています。
このプロジェクトで取得したい結果を入力するすべてのクエリは、列を使用しているCOUNT()
かSUM()
保留中です。DISTINCT
一度に 1 つの列だけを作成して ID を 1 つとして扱う方法はありますか? これまでに行ったことに基づいて、設定するたびにDISTINCT
、属性を設定しようとしている 1 つの列だけを超えて機能することに気付きました。助言がありますか?とてもありがたいです!
重複した ID を含むこれまでのコードの例を次に示します。
SELECT
targeted.person AS "Person",
targeted.work AS "Occu",
(COUNT(targeted.id)) AS "Targeted",
(COALESCE(SUM(targeted.signed="Yes"),0)) AS "Signed",
(COALESCE(SUM(targeted.signed="Yes"),0))/COUNT(targeted.id)*100 AS "Signed %",
(COALESCE(COUNT(question.questionid="96766"),0)) AS "Donated",
(COALESCE(COUNT(question.questionid="96766"),0))/(COALESCE(SUM(targeted.signed="Yes"),0))*100 AS "Donated %",
(COALESCE(SUM(question.surveyresponsename),0)) AS "Donation $",
ROUND((COALESCE(SUM(question.surveyresponsename),0))/(COALESCE(COUNT(question.questionid="96766"),0)),2) AS "Avg Donation",
(CASE WHEN (left(targeted.datesigned,1)="5" AND right(question.datecontacted,2)="13") THEN (COALESCE(SUM(targeted.signed="Yes"),0)) ELSE 0 END) AS "Signed This Month",
(CASE WHEN (left(question.datecontacted,1)="5" AND right(question.datecontacted,2)="13") THEN (COALESCE(COUNT(question.questionid="96766"),0)) ELSE 0 END) AS "Donated This Month",
(CASE WHEN question.ContactType="House Visit" THEN COUNT(question.id) ELSE 0 END) AS "At Home",
(CASE WHEN question.ContactType="Worksite" THEN COUNT(question.id) ELSE 0 END) AS "At Work",
(CASE WHEN (left(events.day,1)="5" AND right(events.day,2)="13") THEN COUNT(events.id) ELSE 0 END) AS "Events This Month"
FROM targeted
LEFT JOIN question ON targeted.id=question.id
LEFT JOIN events ON targeted.id=events.id
GROUP BY targeted.person, targeted.work;
テーブル構造の基本は次のとおりです。
対象:
Field Type Null Key Default
ID bigint(11) YES Primary NO
Work varchar(255) YES NULL
Person varchar(255) YES NULL
Signed varchar(255) YES NULL
DateSigned varchar(255) YES NULL
質問:
Field Type Null Key Default
ID bigint(11) YES Primary NO
QuestionID int(11) YES NULL
SurveyResponseId int(11) YES NULL
SurveyResponseName varchar(255) YES NULL
DateContacted varchar(255) YES NULL
ContactType varchar(255) YES NULL
イベント:
Field Type Null Key Default
ID bigint(11) NO Primary NO
Day varchar(255) YES NULL
EventType varchar(255) YES NULL
結果は次のようになります。
Person Occu Targeted Signed Signed % ...
1 Job 1 1413 765 54.14 ...
2 Job 2 111 80 72.072 ...
2 Job 3 931 715 76.7991 ...
3 Job 4 2720 1435 52.7573 ...
4 Job 5 401 218 54.364 ...
助けてくれてありがとう!