複数の行データを複数の列を持つ行に取得する方法


8

次のようなMySQLテーブルがあります。

User_Id  course_name     course_location   course_id
1        course name 1   location 1        1
1        course name 2   location 2        2
1        course name 3   location 1        3
2        course name 2   location 1        2
2        course name 4   location 4        4

次のような結果をデータで取得するにはどうすればよいですか。

User_id  course 1       course2        course3        course4
1        yes-location1  yes-location2  yes-location1  NULL
2        NULL           yes-location1  NULL           yes-location4

1
MySQLのどのバージョンを使用していますか?あなたが欲しいものはピボットと呼ばれます、この答えはここでstackoverflow.com/questions/7674786/mysql-pivot-tableはあなたが探しているものを表示するはずです。
Jonathan Fite、2016

回答:


7

を使用GROUP BYしてデータをピボットし、でフィルタリングするMAXためCASEに使用する必要がありUser_idます。

クエリ:

SELECT User_id
    , MAX(
        CASE WHEN course_id = 1 THEN course_location END
    ) as Course_1
    , MAX(CASE WHEN course_id = 2 THEN course_location END) as Course_2
    , MAX(CASE WHEN course_id = 3 THEN course_location END) as Course_3
    , MAX(CASE WHEN course_id = 4 THEN course_location END) as Course_4
FROM data
GROUP BY User_id;

SQL Fiddleのサンプルクエリ。

あなたは置き換えることができますcourse_locationによってCONCAT('YES-', course_location)大手がされてYES実際に必要とされています。

出力:

User_Id | Course_1      | Course_2      | Course_3      | Course_4
1       | location 1    | location 2    | location 1    | (null)
2       | (null)        | location 1    | (null)        | location 4

これは古いスレッドですが、これを実行したときのパフォーマンスは何ですか、15個のCASEフィールドを挿入したい場合、そしてこのメ​​ソッドを使用して100,00oの結果がdbになった場合、深刻なパフォーマンスになります。問題?
ティモシマロイ

-1

テーブル作成:

CREATE TABLE VMRRTEST_DATA (
        ID INTEGER, 
        CATG VARCHAR(30 ), 
        PRICE INTEGER, 
        DATE TIMESTAMP
    )

挿入:

INSERT INTO VMRRTEST_DATA VALUES(1,'CAR',1000,CURRENT TIMESTAMP);

INSERT INTO VMRRTEST_DATA VALUES(2,'CAR',2000,(CURRENT TIMESTAMP)- 10 MINUTE);

INSERT INTO VMRRTEST_DATA VALUES(3,'CAR',1000,CURRENT TIMESTAMP - 20 minute);


INSERT INTO VMRRTEST_DATA VALUES(4,'CAR',30000,CURRENT TIMESTAMP);

INSERT INTO VMRRTEST_DATA VALUES(5,'CAR',5000,(CURRENT TIMESTAMP)-20 minute);

結果セット:

ID CATG PRICE DATE
 -- ---- ----- --------------------------
  1 CAR   1000 2018-10-09 22:17:59.907636

  4 CAR  30000 2018-10-09 22:18:32.58254

  2 CAR   2000 2018-10-09 22:30:30.875961

  3 CAR   1000 2018-10-09 22:20:43.80537

  5 CAR   5000 2018-10-09 22:21:14.787224

期待される結果セット:

 RANK ID CATG PRICE DATE
 ---- -- ---- ----- --------------------------
    1  3 CAR   1000 2018-10-09 22:20:43.80537
    1  2 CAR   2000 2018-10-09 22:30:30.875961
    1  5 CAR   5000 2018-10-09 22:21:14.787224
    1  4 CAR  30000 2018-10-09 22:18:32.58254

解決:

SELECT Rank,ID,CATG,PRICE,DATE FROM 
( 

SELECT
--ROW_NUMBER() OVER(ORDER BY PRICE ASC) AS RW_NM,
RANK() OVER (PARTITION BY PRICE ORDER BY DATE DESC) AS Rank,

ID,CATG,
PRICE
,DATE 
FROM  
VMRRTEST_DATA 
--WHERE Rank 
GROUP BY ID,DATE,CATG,PRICE

HAVING COUNT(*)>0
ORDER BY PRICE,DATE DESC
)
WHERE Rank = 1

申し訳ありませんが、あなたの答えは質問には答えません。
Colin 't Hart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.