2017-02-13 11 views
1

HELP!1つの値列と1つの条件列に基づいて列を作成します。

私はこの単純なMYSQLの問題を解決することはできないようです。

は、私は、ソース表では、この形式でデータを持っている:

Date_type  Date    Activity_id 
Preferred  13/02/16 07:30 1 
Planned   13/02/16 08:30 1 
Actual   13/02/16 09:30 1 
Preferred  14/02/16 07:30 2 
Planned   14/02/16 08:30 2 
Actual   14/02/16 09:30 2 

そして、私は報告書でこのようにそれを必要とする:

Activity_id Preferred_Date Planned_Date  Actual_DateDate    
1   13/02/16 07:30 13/02/16 08:30 13/02/16 09:30 
2   14/02/16 07:30 14/02/16 08:30 14/02/16 09:30 

私は今時間グーグルでてきたと私は」すべてのバリエーションを試しました。私はこれをどのように変えることができないのか分かりません。本当に助けてくれてありがとう、みんな、本当にありがとう。

+2

また、??????????????????????????? –

+0

ホルヘ、私はテキストを編集していた。私はテーブルを手に入れることができず、Excelから2枚の写真を追加しました。ごめんなさい。 –

+0

一般的に、データ表示の問題は、プレゼンテーション層で最もよく解決されます。 – Strawberry

答えて

2

これは、MySQLでピボットを行うには良い方法です:

SELECT Activity, 
    MAX(CASE `Type` WHEN 'Preferred' THEN `Value` END) AS Preferred_date, 
    MAX(CASE `Type` WHEN 'Planned' THEN `Value` END) AS Planned_date, 
    MAX(CASE `Type` WHEN 'Actual' THEN `Value` END) AS Actual_date 
FROM MyTable 
GROUP BY Activity; 

彼らはMySQL Reserved Wordsているので、私はバックティックTypeValueを区切り。通常は、予約語を列名として使用しないことをお勧めします。あなたのコメントを再


ピボットデータが行にあり、あなたは通常、別のフィールドの値に応じて、列に特定の値をフォーマットするとき、クエリがあります。たとえば、あなたのケースでは、異なるType値のデータ行があり、それぞれのTypeでラベル付けされた列にタイムスタンプ値をマップしたいとします。これは、行を列に変換するピボットです。

MAX()は多かれ少なかれ、MIN()も使用できました。これは、アクティビティの異なる値ごとにグループ化された行セットに集約関数を適用することを意味します。

CASEはSQLの式です。構文はかなり自明ですが、データと一致する大文字小文字がない場合は、CASE式全体がNULLを返すことが必要です。 MAX()/MIN()はNULLを無視します。したがって、各行グループの各タイプに対して、NULL以外の値を1つだけ取得する必要があります。

+0

私はここでMAXロジックを得られませんでした。少し説明していただけますか? –

+0

ピボットタグがどこから来たのか分かりませんが、case/then/endで解決できるかもしれません。ありがとう、ビル。私はあなたの助けを大事にする! –

+0

私はpivot-queryタグを追加しました。なぜなら、これはあなたがやっていることなのです。 –

関連する問題