web-dev-qa-db-ja.com

2 GROUP BY WITH DISTINCT、SUM、COUNT:PHP MYSQL

参照: 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

1
user3209031

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
4
seventyeightist