行转列-列转行-行分组转列

本文介绍了如何在数据库中进行数据转换,包括使用CASEWHEN进行行转列以按牌号和年月分组计算销售总和,以及利用UNION/UNIONALL和group_concat/WM_CONCAT实现列转行的方法。示例涉及Oracle和MySQL数据库。
摘要由CSDN通过智能技术生成

一、行转列【CASE WHEN】

1、背景

项目中需要开发一张报表,根据牌号来分组,选择年月,导出年月范围的数据。

2、虚拟表

-- Oracle数据库
DROP TABLE T_TEST_TT;
CREATE TABLE T_TEST_TT (
  PH VARCHAR2(50 BYTE) VISIBLE ,
  NY VARCHAR2(10 BYTE) VISIBLE ,
  XS NUMBER(11,4) VISIBLE ,
  ZB NUMBER(11,4) VISIBLE ,
  JG NUMBER(11,4) VISIBLE ,
  CB NUMBER(11,4) VISIBLE 
);
COMMENT ON COLUMN T_TEST_TT.PH IS '牌号';
COMMENT ON COLUMN T_TEST_TT.NY IS '年月';
COMMENT ON COLUMN T_TEST_TT.XS IS '销售';
COMMENT ON COLUMN T_TEST_TT.ZB IS '占比';
COMMENT ON COLUMN T_TEST_TT.JG IS '价格';
COMMENT ON COLUMN T_TEST_TT.CB IS '成本';

3、SQL

根据牌号【PH】分组,将年月【NY】行转列,求各月份销售【XS】的和

SELECT 
    PH,
    SUM(CASE WHEN NY = '202301' THEN XS ELSE 0 END) XS202301,
    SUM(CASE WHEN NY = '202302' THEN XS ELSE 0 END) XS202302
FROM 
    T_TEST_TT 
WHERE 
    NY >= '202301' AND NY <= '202302' 
GROUP BY 
    PH

获得数据后,可以根据销售【XS】+年月【NY】,在数据集合取出来,存放到EXCEL的特定位置。

二、列转行【UNION/UNION ALL】

把【XS】和【ZB】转为多行同一列

三、行分组转列

  1. MySql

group_concat

-- MySql
DROP TABLE IF EXISTS T_TEST_TT;
CREATE TABLE T_TEST_TT (
  PH VARCHAR(50 ) COMMENT '牌号' ,
  NY VARCHAR(10 )  COMMENT '年月' ,
  XS DECIMAL(11,4)  COMMENT '销售' ,
  ZB DECIMAL(11,4)  COMMENT '占比' ,
  JG DECIMAL(11,4)  COMMENT '价格' ,
  CB DECIMAL(11,4)  COMMENT '成本' 
);

INSERT INTO `t_test_tt` VALUES ('牌号1', '202301', 63349.3360, 7.8000, NULL, NULL);
INSERT INTO `t_test_tt` VALUES ('牌号1', '202302', 63349.3360, 7.8000, NULL, NULL)
  1. Oracle

WM_CONCAT

如果不能用 替换 :listagg (SAGE, ',') WITHIN GROUP (ORDER BY SAGE)

listagg(合并字段,'连接符号') within group (order by 字段) 来实现列转行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值