如何将列结果转换为SQL中的列标题? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我有以下表格:

Sample
  id PK

Test
  id PK
  name varchar

Section
  id PK
  name varchar


TestSection
  id PK
  test_id FK
  section_id FK

SampleTestResult
  id PK
  sample_id FK
  test_section_id FK
  result

当我执行以下查询时:

  SELECT DISTINCT
   s.id as sample_id, ts.name as test, str.result
  FROM sample s 
  JOIN sample_test_result str ON s.id=str.sample_id
  JOIN test_section ts ON str.test_section_id=ts.id
  JOIN section sec ON ts.section_id=sec.id

我得到一个看起来像这样的表:

| sample_id | test       | result    |
--------------------------------------
|    1      |  t1        |   fail    |
|    1      |  t2        |   pos     |      
|    2      |  t1        |   neg     |
|    2      |  t3        |   rpt     |
|    3      |  t2        |   pos     |
|    3      |  t4        |   pos     |    

但是我想最终得到这样一个表格:

| sample_id | t1    | t2    | t3    | t4    |
--------------------------------------------
|    1      | fail  | pos   | NULL  | NULL  |
|    2      | neg   | NULL  | rpt   | NULL  |
|    3      | NULL  | pos   | NULL  | pos   |

如何在SQL中转置表 - 这在查询中是否可行?或者它必须是一个SQL视图?

mysql sql view
2个回答
1
投票

使用MySQL,解决此问题的典型方法是使用条件聚合:

SELECT 
    s.id as sample_id,  
    MAX(CASE WHEN ts.name = 't1' THEN str.result END) as t1,
    MAX(CASE WHEN ts.name = 't2' THEN str.result END) as t2,
    MAX(CASE WHEN ts.name = 't3' THEN str.result END) as t3,
    MAX(CASE WHEN ts.name = 't4' THEN str.result END) as t4 
FROM 
    sample s 
    JOIN sample_test_result str ON s.id=str.sample_id
    JOIN test_section ts ON str.test_section_id=ts.id
    JOIN section sec ON ts.section_id=sec.id
GROUP BY s.id

1
投票

你想要条件聚合:

SELECT s.id as sample_id, 
       MAX(CASE WHEN ts.name = 't1' THEN str.result END) as t1,
       . . . 
FROM sample s JOIN 
     sample_test_result str 
     ON s.id=str.sample_id JOIN 
     test_section ts 
     ON str.test_section_id=ts.id
     JOIN section sec ON ts.section_id=sec.id
GROUP BY s.id;
© www.soinside.com 2019 - 2024. All rights reserved.