最后一个问题是无法对我的sql代码进行排序。基本上,我想透视表并以与此格式不同的格式显示: http://sqlfiddle.com/#!9/98436/1
我想做的是旋转LOC_ID和LOC_ID_b以获取平面文件。问题是要使我按LOC_ID和LOC_ID_b分组的代码正常工作,而不确定如何解决它。
我试图达到的结果如下:
PN AAA q AAA c BBB q BBB c CCC q CCC c
A1 2 1
RRR 1 1
T1 1 1
HHH 3 3
答案 0 :(得分:1)
您可以使用条件聚合。如果您的已知loc_id数量有限,则可以这样编写代码
Select pn,
max(case when src = 'h' and loc_id = 'AAA' then val else 0 end) as AAA_qty,
max(case when src = 'r' and loc_id = 'AAA' then val else 0 end) as AAA_count,
max(case when src = 'h' and loc_id = 'BBB' then val else 0 end) as BBB_qty,
max(case when src = 'r' and loc_id = 'BBB' then val else 0 end) as BBB_count,
max(case when src = 'h' and loc_id = 'CCC' then val else 0 end) as CCC_qty,
max(case when src = 'r' and loc_id = 'CCC' then val else 0 end) as CCC_count
from (select 'h' as src, pn, loc_id, sum(qty) val from history group by src,pn,loc_id
union
select 'r' as src, pn, loc_id, count(*) val from rota group by src,pn,loc_id
) s
group by pn
order by pn;
如果在添加或删除loc_id时不知道或不想更改代码,则需要动态sql
set @sql = (
select concat(
'Select pn,',
group_concat(
concat('max(case when src = ' ,char(39),'h',char(39),' and loc_id = ', char(39),loc_id,char(39), ' then val else 0 end) as ' ,
concat(loc_id,'_qty,')
,
'max(case when src = ' ,char(39),'r',char(39),' and loc_id = ', char(39),loc_id,char(39), ' then val else 0 end) as ' ,
concat(loc_id,'_count')
)
)
,' from ('
,
'select ', char(39),'h',char(39),' as src, pn, loc_id, sum(qty) val from history group by src,pn,loc_id'
,
' union '
,
'select ',char(39),'r',char(39),' as src, pn, loc_id, count(*) val from rota group by src,pn,loc_id
) s
group by pn
order by pn;'
)
from
(
select loc_id from history
union
select loc_id from rota
) a
);
prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;
+-----+---------+-----------+---------+-----------+---------+-----------+
| pn | AAA_qty | AAA_count | BBB_qty | BBB_count | CCC_qty | CCC_count |
+-----+---------+-----------+---------+-----------+---------+-----------+
| A1 | 0 | 0 | 2 | 1 | 0 | 0 |
| HHH | 0 | 0 | 0 | 0 | 3 | 0 |
| RRR | 0 | 0 | 0 | 0 | 0 | 1 |
| T1 | 1 | 1 | 0 | 0 | 0 | 0 |
+-----+---------+-----------+---------+-----------+---------+-----------+
4 rows in set (0.00 sec)