行转列案例

mysql@行转列
题二:有以下三张表

商品表:tp

pcodepname
1cpu
2内存
3硬盘

城市表:tc

cnocname
101广州
102深圳
103上海

销售表:ts

pcodecnocount
110110000
1102500
110320000
210140000
210330000
310290000

问题:需要得到以下结构的统计结果,写出SQL语句:

广州深圳上海总计
CPU1000050002000035000
内存4000003000070000
硬盘090000090000
总计500009500050000195000

原文:https://blog.youkuaiyun.com/yangyi22/article/details/7493041

尝试解答思路如下:
(如有不足,请指正)
1、一般情况下,会这样做

select pname,cname,count from ts 
left join tp
on ts.pcode=tp.pcode
left join tc
on ts.cno=tc.cno;

但结果并不是该题目所要的
但结果并不是该题目所要的
2、尝试静态行转列

select pname,cname,
max(case tc.cname when '广州' then ts.count else 0 end) '广州'  from ts 
left join tp
on ts.pcode=tp.pcode
left join tc
on ts.cno=tc.cno;


在这里插入图片描述

select pname,
max(case tc.cname when '广州' then ifnull(ts.count,0) else 0 end) '广州' ,
max(case tc.cname when '深圳' then ifnull(ts.count,0) else 0 end) '深圳' ,
max(case tc.cname when '上海' then ifnull(ts.count,0) else 0 end) '上海'  from ts 
left join tp
on ts.pcode=tp.pcode
left join tc
on ts.cno=tc.cno
group by pname;

在这里插入图片描述

SELECT pname AS "配件名",
    SUM(IF(tc.cname="广州",ts.count,0)) AS "广州",
        SUM(IF(tc.cname="深圳",ts.count,0)) AS "深圳",
        SUM(IF(tc.cname="上海",ts.count,0)) AS "上海",
        SUM(ts.count) AS "总计"
FROM ts left join tp on ts.pcode=tp.pcode
        left join tc on ts.cno=tc.cno
GROUP BY pname
UNION ALL

    SELECT pname AS "配件名",
        SUM(IF(tc.cname="广州",ts.count,0)) AS "广州",
        SUM(IF(tc.cname="深圳",ts.count,0)) AS "深圳",
        SUM(IF(tc.cname="上海",ts.count,0)) AS "上海",
        SUM(ts.count) AS "总计"
    FROM ts left join tp on ts.pcode=tp.pcode
        left join tc on ts.cno=tc.cno
    GROUP BY pname;

在这里插入图片描述

目前我还只会写出行总计,希望大神可以给出列总计的写法,万分感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值