mySQL 5.5-将值链接到与UNION

时间:2018-07-26 13:28:34

标签: mysql

最后一个问题是无法对我的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   

1 个答案:

答案 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)