Cara mendapatkan beberapa data baris menjadi satu baris dengan banyak kolom

8

Saya memiliki tabel MySQL seperti ini:

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

Bagaimana saya bisa mendapatkan data hasil seperti ini:

User_id  course 1       course2        course3        course4
1        yes-location1  yes-location2  yes-location1  NULL
2        NULL           yes-location1  NULL           yes-location4
Lanw
sumber
1
Versi MySQL apa yang Anda gunakan? Apa yang Anda inginkan disebut pivot, jawaban ini di sini stackoverflow.com/questions/7674786/mysql-pivot-table akan menunjukkan kepada Anda apa yang Anda cari.
Jonathan Fite

Jawaban:

7

Anda harus Pivot menggunakan data GROUP BYdengan MAXagregat dan menggunakan CASEuntuk menyaring oleh User_id.

Pertanyaan:

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;

Contoh permintaan dalam SQL Fiddle .

Anda bisa menggantinya course_locationdengan CONCAT('YES-', course_location)yang terdepan YESmemang dibutuhkan.

Keluaran:

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
Julien Vavasseur
sumber
Ini adalah utas lama, tetapi bagaimana kinerjanya dalam melakukan ini, bagaimana jika saya memiliki 15 bidang KASUS yang ingin saya suntikkan, dan bagaimana jika ada yang mengatakan 100,00 hasil db, menggunakan metode ini, apakah itu memiliki kinerja serius masalah?
timothymarois
-1

Pembuatan Meja:

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

Insersi:

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);

Kumpulan hasil:

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

Kumpulan Hasil yang Diharapkan:

 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

Larutan:

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
sharma ankit
sumber
Maaf, tetapi jawaban Anda tidak menjawab pertanyaan.
Colin 't Hart