1

次のようなユーザーアクションを記録するために使用する単純な「アクション」テーブルがあります。

{
  label (varchar),
  timestamp
}

ユーザーが実行するすべてのアクションのレコードが保存されます。

次のようなレポートを出力する必要があります。

Date, Label1Count, Label2Count, Label3Count, ... 
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...
dd/mm/yy, 34, 44, 55, ...

ここで、Dateはアクションが発生した日であり、各ラベルヘッダーは私が記録するラベルの1つです。

私は問題のないものに似たものを出力することができます:

label, date, count
label, date, count
...

そして、ラベルがグループ化されてから日付が表示されるように注文します。

次に、目的のビューに一致するように、Excelにコピーして貼り付ける必要があります。

純粋なSQLを使用して最初のビューを取得する方法はありますか?PythonとSQLの組み合わせでそれを行うことはできますが、SQLだけでそれを行うことができると確信していますか?

ありがとう

4

2 に答える 2

1

PostGreSQLで使用できますcrosstabが、私はそれが好きではありません。

代わりにこのパターンを使用します...

SELECT
  timestamp,
  SUM(CASE WHEN label = 'x' THEN 1 ELSE 0 END)           AS label_x_count,
  SUM(CASE WHEN label = 'y' THEN 1 ELSE 0 END)           AS label_y_count,
  SUM(CASE WHEN label = 'z' THEN 1 ELSE 0 END)           AS label_z_count
FROM
  yourTable
GROUP BY
  timestamp

明らかに、これは、ピボットしているすべてのラベルを知っている場合にのみ機能します。

すべてのラベルを知っているわけではなく、動的な数の列を含む結果セットが必要な場合は、動的SQL (SQLを書き込むコード、具体的にはさまざまなラベルの新しいコード行)が必要です。それを実行できる静的クエリは1つもありません。


設計時にさまざまなラベル値がわからない場合は動的SQLが必要になるため、正規化されたデータセットが実際にはデータレイヤーで最適な方法であることがよくあります。クライアントコードは、その正規化されたデータセットをモデルレイヤーのフラットファイルデータセットに変換できます。または類似。

このため、SQL環境でデータをピボットしないことをお勧めします。

于 2012-10-15T10:37:36.037 に答える
0

これはテーブルピボットです。純粋なSQLで実現するのは簡単ではありません。ただし、ラベルのケース数が固定されている場合は、SELECTCASEWHENステートメントで成功する可能性があります。ラベルの種類が固定されていない場合は、別の方法を選択する必要があります。一部のSQLエンジンのみがこれに対する解決策を持っていません。これを見てください: http ://www.postgresql.org/docs/9.1/static/tablefunc.html

于 2012-10-15T10:33:14.820 に答える