2016-03-29 4 views
0

私はすでにすべての投稿を同じようなタイトルで読んだことがありますが、正解は見つかりませんでした。
私が本当に必要とするのは、複数の行があるので、MySQLテーブルのデータを数えてからgroup_concatを実行することです。
私のテーブルには、この
enter image description here
のように見え、ここで私は、クエリ
countとgorup_concatを使ってSQLコードを書く

SELECT 
    count(cal.day) * 8, 
    w.name 
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id 
    RIGHT JOIN worker as w ON c.worker_id = w.id 
    GROUP BY c.id 
    ORDER BY w.name asc 

を実行しようとした方法です。しかし、私はいくつかの労働者のために複数の行を取得し、私がため、カウントそれらをGROUP_CONCATすることはできません()。できるだけ私が手伝ってくださいので、私が作ったmysqlプロシージャのためにこれが必要です。
私はディランのためにあなたに十分な情報

編集gived私がしました願っています:

は、出力の違いを参照してくださいが
GROUP BYがc.id BY
enter image description here

GROUPをw.id
enter image description here

+0

'sql-server'タグを削除しました – HoneyBadger

+0

なぜ' GROUP BY w.id'ではなく 'GROUP BY c.id'ですか? –

+0

@DylanSu編集者の違いをみると、1ヶ月または1ヶ月以上ある。 – galabl

答えて

1

MySQLは、のように2つの集約関数を同時に使用することはできません。

したがって、次のようにsub-queryを使用して対処することができます。

SELECT 
    GROUP_CONCAT(t.cnt_cal_day) as cnt_days, 
    t.name 
FROM 
( 
    SELECT 
     count(cal.day) * 8 as cnt_cal_day, 
     w.name 
    FROM claim as c 
    RIGHT JOIN calendar as cal ON c.id = cal.claim_id 
    RIGHT JOIN worker as w ON c.worker_id = w.id 
    GROUP BY c.id 
    ORDER BY w.name asc 
) t 
+2

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – Ferrybig

0

質問は私にとってはまだ分かりませんが、私はあなたが必要とするものを推測しようとします。

このクエリ:

SELECT 
    w.name, 
    COUNT(cal.day) * 8 AS nb_hours 
FROM worker w 
    LEFT JOIN claim c ON w.id = c.worker_id 
    INNER JOIN calendar cal ON c.id = cal.claim_id 
GROUP BY w.id 
ORDER BY w.name ASC 

がそれぞれ1のために、すべての労働者の名前を返すと、彼らのために承認された休暇の時間数。

代わりにLEFT JOIN calendarを使用すると、各作業者が請求した休暇の時間数が表示されます(承認済みおよび未承認)。唯一、唯一承認されていない承認、休暇の彼らが持っているクレーム(なしの種類に応じて、

SELECT 
    w.name, 
    c.approved,   # <---- I assumed the name of this field 
    COUNT(cal.day) * 8 AS nb_hours 
FROM worker w 
    LEFT JOIN claim c ON w.id = c.worker_id 
    LEFT JOIN calendar cal ON c.id = cal.claim_id 
GROUP BY w.id, c.approved 
ORDER BY w.name ASC 

この問合せは、各ワーカーのための1つのまたは2行を返す必要があります。それらを分離するためには、このようなクエリを行う必要があります、 どちらも)。休暇の申し立てがない労働者の場合、クエリはapprovedNULLとの0を返します。

関連する問題