2

次の単純なクエリを検討してください。

SELECT 
    year(t.date) AS y, 
    month(t.date) AS m, 
    t.person_id AS id, 
    count(*) AS freq
FROM 
    table t
WHERE 
    t.date>='2013-01-01' AND t.date<='2013-06-30'
GROUP BY y, m, id

これにより、次のような結果が得られます。

y     m  id   freq
------------------
2013  1  100  2
2013  1  101  7
2013  1  102  1
2013  2  100  5
2013  2  101  4
2013  2  102  11
...

各月の頻度の合計に対する頻度の割合を含む列を追加したいと思います。

y     m  id   freq perc
-----------------------
2013  1  100  2    20
2013  1  101  7    70
2013  1  102  1    10
2013  2  100  5    25
2013  2  101  4    20
2013  2  102  11   55
...

これまでの私の解決策は、これをselect句に追加することです:

count(*) * 100 / (SELECT count(*) FROM table WHERE year(date)=y AND month(date)=m) AS perc

しかし、特に必要なすべての値が最初のクエリの結果に既に存在するため、副選択は避けたいと思います。これには集計値の集計が必要ですが、これを行う方法がわかりません。何か案は?

4

2 に答える 2

0

あなたが提案している種類のサブクエリなしでは、MySQL でこれを行う方法はありません。ただし、合計して 100% になる数値を取得するには、クエリの分母に分子と互換性のある WHERE 句が含まれるように注意する必要があります。

提案されたソリューションでは、合計が 100% になることはありません。

追加の列なしで提案したクエリを使用すると、

SELECT 
    year(t.date) AS y, 
    month(t.date) AS m, 
    t.person_id AS id, 
    count(*) AS freq
FROM 
    table t
WHERE 
    t.date>='2013-01-01' AND t.date<='2013-06-30'
GROUP BY y, m, id

出発点として、必要な最終的なクエリは次のようになります。

SELECT 
    year(t.date) AS y, 
    month(t.date) AS m, 
    t.person_id AS id, 
    count(*) AS freq,
    (count(*) * 100) / 
        (
            select count(*) 
            from table t 
            where t.date>='2013-01-01' 
            AND t.date<='2013-06-30'
        )
FROM 
    table t
WHERE 
    t.date>='2013-01-01' AND t.date<='2013-06-30'
GROUP BY y, m, id

テーブル (テーブルと呼ばれる) がエラーを生成するという既知の問題を使用して、このクエリを提案します。私が行った小さなテストでは、名前を t1 に変更しました。一般に、テーブルを 'table' と呼ぶことは移植性がありません。

于 2013-08-14T22:49:09.747 に答える