所以,假设我有一个名为"进口"看起来像这样:
| id | importer_id | total_m | total_f |
|====|=============|=========|=========|
| 1 | 1 | 100 | 200 |
| 1 | 1 | 0 | 200 |
我需要查询以这种方式将其返回到透视或转置(行到列):
| total_m | sum(total_m) |
| total_f | sum(total_f) |
我无法在不使用其他表(可能是临时表?)和使用联合的情况下考虑这样做的方法,但无论如何应该有更好的方法(可能使用CASE或IF?)。
提前致谢。
答案 0 :(得分:3)
select 'total_m', sum(total_m) from imports
union
select 'total_f', sum(total_f) from imports
答案 1 :(得分:0)
您可以通过首先扩展行数来“取消移动”,这通过交叉连接2行子查询来完成。然后在每个行上使用相关的case表达式条件将前一列与新行对齐(“条件聚合”)。
MySQL 5.6架构设置:
CREATE TABLE imports
(`id` int, `importer_id` int, `total_m` int, `total_f` int)
;
INSERT INTO imports
(`id`, `importer_id`, `total_m`, `total_f`)
VALUES
(1, 1, 100, 200),
(1, 1, 0, 200)
;
查询1 :
select
*
from (
select
i.importer_id
, concat('total_',cj.unpiv) total_type
, sum(case when cj.unpiv = 'm' then total_m
when cj.unpiv = 'f' then total_f else 0 end) as total
from imports i
cross join (select 'm' as unpiv union all select 'f') cj
group by
i.importer_id
, cj.unpiv
) d
<强> Results 强>:
| importer_id | total_type | total |
|-------------|------------|-------|
| 1 | total_f | 400 |
| 1 | total_m | 100 |