4

私はPostgreSQLデータベースを使用しており、次のようなテーブルがあります。

--------------------------------------
| Date  | MetricType  | MetricValue  |
--------------------------------------
| date1 | MetricA     | val          |
--------------------------------------
| date1 | MetricB     | val          |
--------------------------------------
| date1 | MetricC     | val          |
--------------------------------------
| date2 | MetricA     | val          |
--------------------------------------
| date2 | MetricB     | val          |
--------------------------------------
| date2 | MetricC     | val          |
--------------------------------------

ご覧のとおり、各日付には一連のメトリックタイプがあり、各タイプには値があります。このデータを次のマナーで組み合わせたSelectステートメントを書きたい

------------------------------------------
| Date  | MetricA  | MetricB  | MetricC  | 
------------------------------------------
| date1 | val      | val      | val      |
------------------------------------------
| date2 | val      | val      | val      |
------------------------------------------

これらの結果を得るために、このSelectステートメントを作成する方法がわかりません。誰か助けてもらえますか?

4

4 に答える 4

3

このデータ変換は重要です。データベースにピボット関数がない場合は、次のCASE式で集計関数を使用できます。

select Date,
  max(case when MetricType = 'MetricA' then MetricValue end) MetricA,
  max(case when MetricType = 'MetricB' then MetricValue end) MetricB,
  max(case when MetricType = 'MetricC' then MetricValue end) MetricC
from yourtable
group by Date

SQL FiddlewithDemoを参照してください

結果は次のとおりです。

|  DATE | METRICA | METRICB | METRICC |
---------------------------------------
| date1 |     val |     val |     val |
| date2 |     val |     val |     val |

テーブルで複数の結合を使用してこれを行うこともできます。

select a.date as Date,
 a.MetricValue as MetricA,
 b.MetricValue as MetricB,
 c.MetricValue as MetricC 
from yourtable a
left join yourtable b 
  on a.date = b.date and b.MetricType = 'MetricB'
left join yourtable c 
  on a.date = c.date and c.MetricType = 'MetricC'
where a.MetricType = 'MetricA'

SQL FiddlewithDemoを参照してください

于 2013-01-16T21:07:50.390 に答える
3

http://www.artfulsoftware.com/infotree/queries.php#78を参照してください

チュートリアルの場合、探しているものは「ピボット」と呼ばれます。これは、次のようにCASEを使用して実行することもできます:http://stackoverflow.com/questions/1241178/mysql-rows-to-columns

于 2013-01-16T21:03:28.070 に答える
3

実際、Postgresにはピボット機能があります。追加のモジュールtablefuncをインストールします。
この関連する質問の下で詳細と説明を見つけてください:
PostgreSQLクロス集計クエリ

クエリは次のようになります。メトリックがデータ型であると仮定するとinteger

SELECT * FROM crosstab(
   'SELECT date, metrictype, metricvalue 
    FROM   tbl
    ORDER  BY 1,2'  -- could also just be "ORDER BY 1" here

   ,$$VALUES ('MetricA'::text), ('MetricB'), ('MetricC')$$)
AS ct ("Section" text, "MetricA" int, "MetricB" int, "MetricC" int);

単純なクエリの場合、@Bluefeetで示されているようなCASEステートメントで十分です。ただし、このクエリの実行ははるかに高速で、列のリストが長い場合やテーブルが大きい場合ははるかに短くなります。

于 2013-01-16T23:33:30.030 に答える
0
    select a.date as Date,
     a.metric as MetricType ,
b.metric as MetricType ,
     c.metric as MetricType 
    from (select distinct date from yourtable where metric = 'metricA')  a
    join yourtable b on a.date = b.date and b.metric = 'metricB'
    join yourtable c on a.date = c.date and c.metric = 'metricC'
于 2013-01-16T21:08:07.163 に答える