SUM 以外の集計を使用して、MySQL で行をピボットすることは可能ですか? 私はオンラインで、そして私のコースブックを見てきました。しかし、何も見つかりません。
1 に答える
簡単な答え - はい、実行する必要があるクエリの種類に応じて、他の集計を使用してピボットできます。それぞれが特殊な目的を果たすことができます。
COUNT()
行をカウントアップするために使用します(のようにSUM()
)
集計関数は値を消去するため、おそらく見慣れているNULL
パターンに似たパターンに遭遇することがあります (その式は 1 または 0 を返し、合計されます)。このメソッドで集計を使用するSUM(CASE...)
代わりに、その式が値 (任意の値) または. s が削除され、返された null 以外の行がカウントアップされます。ただし、これは値をカウントアップする場合にのみ役立ちますSUM()
COUNT()
NULL
NULL
COUNT()
val = 1
集計を使用して、グループごとに行をカウントアップする例を次に示しますCOUNT()
。次の表があり、結果を列として表示するとしますa, b
。
group value
a 1
a 1
a 2
b 1
b 2
使用するCOUNT()
SELECT
`group`,
/* the aggregate eliminates NULLs (rows where val <> 1) */
COUNT(CASE WHEN `group` = 'a' THEN val ELSE NULL END) AS `a`,
COUNT(CASE WHEN `group` = 'b' THEN val ELSE NULL END) AS `b`
FROM pivot
WHERE val = 1
結果:
a b
-------------
2 1
デモンストレーション: http://sqlfiddle.com/#!2/b4585/7
SUM()
これは基本的に、およびゼロと 1で実行できるものと同じです。
おそらく見たことがあるように使用SUM()
すると、同じことが達成されます。
SELECT
/* the aggregate eliminates NULLs (rows where val <> 1) */
SUM(CASE WHEN `group` = 'a' THEN 1 ELSE 0 END) AS `a`,
SUM(CASE WHEN `group` = 'b' THEN 1 ELSE 0 END) AS `b`
FROM pivot
WHERE val = 1
デモンストレーション: http://sqlfiddle.com/#!2/b4585/8
MAX()
キーと値のペアのリストをピボットするために使用します。
行から列への 1 対 1 のマッピングを変更したい場合があります。これは、たとえば、キーと値のペアのリストを平坦化する必要がある場合に役立ちます。次のようなテーブルがあり、ピボット アウトしたい列ごとに 1 つの行しかないとします。
key value
------------
k1 v1
k2 v2
k3 v3
...そして、次のような結果が必要です。
k1 k2 k3
-----------
v1 v2 v3
この場合、MAX()
またはMIN()
集計を使用できます。これも、集計によって NULL 値が削除されるため、実際には非 null を持つ値のみが返されるため、 になりますMAX()
。
したがって、このクエリはそれらをピボットしますが、結果は 3 行になり、行ごとに 1 つの非 null のみになります。
SELECT
CASE WHEN `key` = 'k1' THEN `value` ELSE NULL END AS `k1`,
CASE WHEN `key` = 'k2' THEN `value` ELSE NULL END AS `k2`,
CASE WHEN `key` = 'k3' THEN `value` ELSE NULL END AS `k3`
FROM key_value
結果:
k1 k2 k3
---------------
v1 NULL NULL
NULL v2 NULL
NULL NULL v3
デモンストレーション: http://sqlfiddle.com/#!2/813b3/5
集計を使用すると、 sMAX()
を取り除くことで効果的に 1 行に折りたたむことができます。NULL
SELECT
MAX(CASE WHEN `key` = 'k1' THEN `value` ELSE NULL END) AS `k1`,
MAX(CASE WHEN `key` = 'k2' THEN `value` ELSE NULL END) AS `k2`,
MAX(CASE WHEN `key` = 'k3' THEN `value` ELSE NULL END) AS `k3`
FROM key_value
必要な結果が得られます - 1 行がピボットアウトされます:
k1 k2 k3
-----------
v1 v2 v3
デモンストレーション: http://sqlfiddle.com/#!2/813b3/4