1

SUM 以外の集計を使用して、MySQL で行をピボットすることは可能ですか? 私はオンラインで、そして私のコースブックを見てきました。しかし、何も見つかりません。

4

1 に答える 1

2

簡単な答え - はい、実行する必要があるクエリの種類に応じて、他の集計を使用してピボットできます。それぞれが特殊な目的を果たすことができます。

COUNT()行をカウントアップするために使用します(のようにSUM()

集計関数は値を消去するため、おそらく見慣れているNULLパターンに似たパターンに遭遇することがあります (その式は 1 または 0 を返し、合計されます)。このメソッドで集計を使用するSUM(CASE...)代わりに、その式が値 (任意の値) または. s が削除され、返された null 以外の行がカウントアップされます。ただし、これは値をカウントアップする場合にのみ役立ちますSUM()COUNT()NULLNULLCOUNT()

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

于 2013-01-25T03:42:34.693 に答える