Cách nhận nhiều dữ liệu hàng thành một hàng có nhiều cột


8

Tôi có một bảng MySQL như thế này:

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

Làm thế nào tôi có thể nhận được dữ liệu một kết quả như thế này:

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

1
Phiên bản nào của MySQL bạn đang sử dụng? Những gì bạn muốn được gọi là một trục, câu trả lời này ở đây stackoverflow.com/questions/7674786/mysql-pOLL-table sẽ cho bạn thấy những gì bạn đang tìm kiếm.
Jonathan Fite

Câu trả lời:


7

Bạn phải Pivot dữ liệu sử dụng GROUP BYvới MAXsử dụng tổng hợp và CASEđể lọc theo User_id.

Truy vấn:

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;

Truy vấn mẫu trong SQL Fiddle .

Bạn có thể thay thế course_locationbằng CONCAT('YES-', course_location)là hàng đầu YESlà thực sự cần thiết.

Đầu ra:

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

Đây là một chủ đề cũ, nhưng hiệu suất trong việc này là gì, nếu tôi có 15 trường CASE tôi muốn tiêm và nếu có 100,00o kết quả trong db, sử dụng phương pháp này, thì nó có hiệu suất nghiêm trọng không vấn đề gì?
timothymarois

-1

Tạo bảng:

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

Chèn:

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

Tập kết quả:

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

Bộ kết quả dự kiến:

 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

Giải pháp:

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

Xin lỗi, nhưng câu trả lời của bạn không trả lời câu hỏi.
Colin 't Hart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.