参照: https://stackoverflow.com/questions/32066097/group-by-with-having-distinct-php-mysql
私は答えを得ました(coytechに感謝します)が、その中にもう1つの列が必要です:
に従って:
id | mid | pid | owgh | nwgh |
1 3 12 1.5 0.6
2 3 12 1.5 0.3
3 3 14 0.6 0.4
4 3 15 1.2 1.1
5 4 16 1.5 1.0
6 4 17 2.4 1.2
7 3 19 3.0 1.4
私は答えを得ました
テストGROUP BY midから、mid、COUNT(distinct pid)をcpid、SUM(nwgh)をtotalnwghとして選択します
sqlfiddle: http://sqlfiddle.com/#!9/45e68/2
mid cpid totalnwgh
3 4 3.8
4 2 2.2
しかし、上に私は以下のようなもう1つの列が必要です:totowgh
mid cpid totalnwgh totowgh
3 4 3.8 6.3 (DISTINCT value as per pid column)
4 2 2.2 3.9
ここで、totowgh = 6.3は、個別のpid列ごとのowgh列のDISTINCT値によって決まります。
mid = 3はカウント5ですが、mid = 3の場合は異なるpid = 4と同じように、「明確な」owgh = 6.3はmid = 3および異なるpidの場合です。
Pid = 12なので、列のowgh値1.5は2倍です...したがって、そのカウントは1倍です。
1.5 + 0.6 + 1.2 + 3 = 6.3(これはpidのDISTINCT値によるものではないことに注意してください)
注:私はpidごとに異なるpidまたはグループごとに異なるowgh値が必要です.. owgh 0.6の値を1.5で置き換えると、7.2ではなく5.7になりますが、owgh 0.6の値はpid = 14ではなくpid =に属します12したがって、変更の合計数...しかし、必要なのは7.2です。
どういう意味ですか: sqlfiddle.com/#!9/2a53c/6
Midとpidの値ごとにowghの「個別の」値の合計-異なるデータの「粒度」を求めていると思います。
例えばmid = 3の場合、1.5 + 0.6 + 1.2 + 3.0 = 6.3を追加します。 1.5を2回ではなく1回だけカウントします。ただし、1.5のレコードIDが2つの異なるpid値の場合、1.5を2回カウントする必要があります。
これを行う方法の1つは、「テスト」テーブルを直接クエリする代わりに、事前に集計の一部を計算することです。
Select mid,
COUNT(distinct pid) as cpid,
SUM(nwgh) as totalnwgh,
SUM(owgh) as totowgh -- I added this one
from
(select mid, pid, sum(distinct owgh) as owgh, sum(nwgh) as nwgh from test group by mid, pid) as A
GROUP BY mid