将SQL行值转换为列标题

4
我可以帮您进行翻译。以下是表格内容:

我有以下表格:

tableA
+-----------+--------+
| tableA_id |  code  |
+-----------+--------+
|         1 | code A |
|         2 | code B |
|         3 | code A |
|         3 | code C |
|         3 | code B |
|         4 | code A |
|         4 | code C |
|         4 | code B |
|         5 | code A |
|         5 | code C |
|         5 | code B |
+-----------+--------+

我希望使用查询来显示代码A、代码B和代码C作为列标题,然后值将显示表A_ID条目是否在代码字段中包含该代码。因此,类似于这样:

+-----------+------------------------------+
| tableA_id |  code A |  code B  |  code C |
+-----------+------------------------------+
|         1 |   yes   |          |         |
|         2 |         |   yes    |   yes   |
|         3 |   yes   |   yes    |   yes   |

etc...

你能在SQL中做到这点吗?

不,你不能 ;) 没有像PIVOT/CROSSTAB/SELF JOIN/CONDITIONAL AGGREGATION这样的东西。 - Lukasz Szozda
我删除了多余的数据库标签。请随意添加您实际使用的数据库标签。 - Gordon Linoff
1
我必须承认一件事情。当我看到“你能用SQL做到这个吗?”或者“用SQL可以实现吗?”时,我会把它视为接受的挑战。 - Lukasz Szozda
在SQL中有一个称为“pivot”的功能。 - Abdul Hannan Ijaz
3个回答

5

使用条件聚合(在不同方言之间可移植):

SELECT tableA_id,
       MAX(CASE WHEN code ='code A' THEN 'yes' END) AS "code A",
       MAX(CASE WHEN code ='code B' THEN 'yes' END) AS "code B",
       MAX(CASE WHEN code ='code C' THEN 'yes' END) AS "code C"
FROM tableA
GROUP BY tableA_id;

SqlFiddleDemo_MySQL SqlFiddleDemo_Postgresql

输出:

╔════════════╦═════════╦═════════╦════════╗
║ tableA_id  ║ code A  ║ code B  ║ code C ║
╠════════════╬═════════╬═════════╬════════╣
║         1  ║ yes     ║ (null)  ║ (null) ║
║         2  ║ (null)  ║ yes     ║ (null) ║
║         3  ║ yes     ║ yes     ║ yes    ║
║         4  ║ yes     ║ yes     ║ yes    ║
║         5  ║ yes     ║ yes     ║ yes    ║
╚════════════╩═════════╩═════════╩════════╝

有许多可能性(搜索):

PIVOT            -> SQL Server/Oracle
CROSSTAB         -> Postgresql
SELF OUTER JOIN  -> All
CONDITIONAL AGG  -> All
...

MySQL和PostgreSQL在这方面的语法相同吗?此外,MAX有什么作用? - user740521
@user740521 它可以在MySQL/PostgreSQL/Oracle上运行。条件聚合是多平台的。MAX()函数是为了满足GROUP BY而需要的。 - Lukasz Szozda

0
你需要类似于这样的SQL语法。
Select *
From Table1
pivot ( Aggregate function For Column Name in ([CodeA], [CodeB] , [CodeC])) as PivotTable

1
祝你在MySQL/Postgresql中好运。同时,使用[]引用是SQL Server特有的。 - Lukasz Szozda

0
如果你想要一个动态的SQL语句,你可以尝试下面的代码。你只需要更改表名和/或列名即可。
declare
cursor code is select code, rownum rn, count(*) over (partition by 1 ) as cnt from (select distinct code from test) order by 1;
build_Case clob;
a varchar2(100);
begin

for i in code loop
if i.rn <> i.cnt then
build_case := build_case || CHR(10) || ' max((case when code = ''' || i.code || ''' then ''yes'' else null end)) ' || i.code || ',';
else 
build_case := build_case || CHR(10) || ' max((case when code = ''' || i.code || ''' then ''yes'' else null end)) ' || i.code;
end if;
end loop;

build_case := 'select id,' || build_case || ' from test group by id';
dbms_output.put_line(build_Case);

--execute immediate build_Case;
end;
/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接