2

ピボットテーブル/クロステーブルの作成に苦労しています。最後にインラインで編集したいのですが、まずは少なくともテーブルを作りたいと思います。

テーブル'tarifs'には、Id、TarifCode、TarifDescrのようなものがあります。

1, A, Overnight
2, P, Room
3, V, Adult No discount
etc.

アプリケーションのある時点で、開始日、終了日、および該当するタリフコードの値(金額)を入力します。好き:

2012-02-05, 2012-02-09, A:1, P:0, V:2

送信後、SQLクエリは、次のようなID、Date、TarifCode、Valueのテーブル「Occupacion」に入力されます。

1, 2012-02-05, A, 1
2, 2012-02-05, V, 2
3, 2012-02-06, A, 1
4, 2012-02-06, V, 2
5, 2012-02-07, A, 1
6, 2012-02-07, V, 2
7, 2012-02-08, A, 1
8, 2012-02-08, V, 2
9, 2012-02-09, A, 1
10, 2012-02-09, V, 2

これが私の質問です:次の出力を与えるクエリ(またはビュー)を作成するにはどうすればよいですか?

-- 2012-02-05 | 2012-02-06 | 2012-02-07 | 2012-02-08 | 2012-02-09
A           1            1            1            1            1
V           2            2            2            2            2

このトピックに関連するほとんどの投稿では、値がわかっています。私の場合、TarifCode Aが使用されていないか、新しいTarifCodeが作成されていることがあります。

最後に、これをJSONスタイルで作成して、グリッドでのインライン編集に使用できるようにします。多分誰かがそれを経験したことがありますか?

4

1 に答える 1

0

SQL を使用してこれを実行する場合は、集計関数と式を使用して MySQL でデータをピボットCASEできます。これにより、date値が取得され、列に変換されます。

select tarifcode,
  max(case when Date = '2012-02-05' then value end) `2012-02-05`,
  max(case when Date = '2012-02-06' then value end) `2012-02-06`,
  max(case when Date = '2012-02-07' then value end) `2012-02-07`,
  max(case when Date = '2012-02-08' then value end) `2012-02-08`,
  max(case when Date = '2012-02-09' then value end) `2012-02-09`
from yourtable
group by tarifcode

デモで SQL Fiddle を参照してください

日付が不明な場合は、次のような準備済みステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when Date = ''',
      Date,
      ''' then value end) AS `',
      Date, '`'
    )
  ) INTO @sql
FROM  yourtable;

SET @sql = CONCAT('SELECT TarifCode, ', @sql, ' 
                  FROM yourtable 
                  GROUP BY TarifCode');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with Demoを参照してください。両方のクエリの結果は次のとおりです。

| TARIFCODE | 2012-02-05 | 2012-02-06 | 2012-02-07 | 2012-02-08 | 2012-02-09 |
------------------------------------------------------------------------------
|         A |          1 |          1 |          1 |          1 |          1 |
|         V |          2 |          2 |          2 |          2 |          2 |

編集、別のテーブルに参加したい場合は、次のようなものを使用できます。

select 
  t.tarifcode,
  max(case when Date = '2012-02-05' then value end) `2012-02-05`,
  max(case when Date = '2012-02-06' then value end) `2012-02-06`,
  max(case when Date = '2012-02-07' then value end) `2012-02-07`,
  max(case when Date = '2012-02-08' then value end) `2012-02-08`,
  max(case when Date = '2012-02-09' then value end) `2012-02-09`
from tarifs t
left join yourtable y
  on t.tarifcode = y.tarifcode
group by t.tarifcode

デモで SQL Fiddle を参照してください

于 2013-02-20T21:52:11.113 に答える