2016-06-13 5 views
0

私はアプリケーションの詳細を格納するテーブルを持っています。アプリケーションは、スコアを示す一連のデータに過ぎません。mysql-ピボットテーブルから最新の日付と時刻に基づいてデータを取得できません

各アプリケーションは、データベース内のテーブルの部分は、一つ以上を有していてもよい1から6

同じアプリケーションの範囲の値を持つことができ、したがって、6部、すなわち1,2,3,4,5、および6を有しますエントリは部品のために保存されます。同様に、ID 9を持つアプリケーションは、パート1に対して3つのエントリを持つことができます(各エントリにはスコアがあり、スコアは単なる数値です)。

私が取ろうとしているのは、アプリケーションごとに6つの部分すべてのスコアを取得しますが、最新のスコアだけを表示する必要があります。したがって、アプリケーション9のパート1が01-06-2016に8のスコアを持ち、03-06-2016に3のスコアがある場合、3がスコアとして表示されます。

私のテーブルには、次のようになります。

CREATE TABLE IF NOT EXISTS `reg_updates` (
    `id` int(11) NOT NULL, 
    `application_id` int(11) NOT NULL, 
    `part` int(11) NOT NULL, 
    `reg_score_id` int(11) NOT NULL, 
    `reg_score` int(11) NOT NULL, 
    `done_date` date NOT NULL, 
    `done_time` time NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1; 

そして、これは私がこの目的のために書かれているクエリです:

SELECT MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,RU.application_id, 
MAX(CASE WHEN (RU.part = 1) THEN RU.reg_score END) part1Score, 
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score, 
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score, 
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score, 
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score, 
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score 
FROM reg_updates AS RU 
GROUP BY RU.application_id; 

しかし、それは正しいデータをフェッチいません。最新のdone_dateとdone_timeに基づいてデータを取得することができません。私は最初のエントリに基づいて取得しています。

これはちょっとこのピボットテーブルを作成するために続いたtutorial linkです。

サンプルはSQL FIDDLEです。

答えて

1

さて、あなたはまずインナーとして使用されますAPPLICATION_IDおよび部による最新の日時を持つすべてのデータ、参加

SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,RU.part 
FROM reg_updates 
GROUP BY application_id, part; 

を取得することにより、クエリ

SELECT 
    -- I'm not sure you want that line, do you ? It will only retrieve the latest date_time of ALL your parts for that application 
    MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date, 
    RU.application_id, 
    MAX(CASE WHEN (RU.part = 1) THEN RU.reg_score END) part1Score, 
    MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score, 
    MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score, 
    MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score, 
    MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score, 
    MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score 
FROM reg_updates AS RU 
--now you join on the previous 
join (SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,part 
    FROM reg_updates 
    GROUP BY application_id, part) maxValues 
     on maxValues.part = RU.part and 
      maxValues.application_Id = RU.application_id and 
      maxValues.maxDate = CONCAT(RU.done_date,' ',RU.done_time) 

GROUP BY RU.application_id; 

でそれを使用する必要がありますところで、あなたはすべての部分の最新のdate_timeを取得するだけですが、それはあなたが望むものだと思われますか?

+0

私はこれを試してみましょう。 –

関連する問題