原始数据查询语句如下,需要查出实名用户和非实名用户的总数和总金额。

select real_flg 是否实名, count(*) 笔数,sum(amt) 总额  from  t_user where sts = 'S' group by real_flg;


通过group by后查出来是多行的列表,但我需要的结果是四个字段别名分别存这四个值,
也不想通过两条sql(唯一区别就是where real_flg = 1 和 where real_flg = 0的区别)来实现。这时就可以用列转行了。

sql如下

select
sum(decode(real_flg, '1', count(*), 0)) as 实名笔数,
sum(decode(real_flg, '1', sum(amt), 0)) as 实名总额,
sum(decode(real_flg, '0', count(*), 0)) as 未实名笔数,
sum(decode(real_flg, '0', sum(amt), 0)) as 未实名总额
from  t_user where sts= 'S' group by real_flg;


主要是用到了sum ,decode,group by。如上第一个decode字段的意思是 real_flg = 1 时,求count(*), 没有 = 1的情况就显示最后那个参数作为默认值,也就是0。下同。
但decode是oracle才有的,其他的数据库只能用类似的decode的功能来代替。类似的有聚合函数 和case when 来代替。

行转列(PIVOT)与列转行(UNPIVOT)是类似矩阵倒置的效果,不是我本次想要的结果。 有兴趣的可以去了解一下。

下面看下mysql行转列的例子
t_order存了售货员的销售单子,现需统计每个售货员的笔数和金额(包括全部、成功、失败)

第一步根据销售员先分组

# 查询每个销售员 成功笔数,成功金额、失败笔数、失败金额
SELECT tx_dt tx_dt, sale_cnl sale_cnl, ord_sts , COUNT(*) tx_num, IFNULL(SUM(amt),0) tx_amt
FROM t_order
WHERE tx_dt = '20210421'
GROUP BY sale_cnl, ord_sts


销售员10号只有一笔失败记录,销售员13号1笔失败1954笔成功记录

第二步,行转列

SELECT t.sale_cnl , SUM(t.tx_num) all_num, SUM(t.tx_amt) all_amt,
SUM(CASE WHEN t.ord_sts='F1' THEN t.tx_num ELSE 0  END) AS fail_num,
SUM(CASE WHEN t.ord_sts='F1' THEN t.tx_amt ELSE 0  END) AS fail_amt,
SUM(CASE WHEN t.ord_sts='S1' THEN t.tx_num ELSE 0  END) AS succ_num,
SUM(CASE WHEN t.ord_sts='S1' THEN t.tx_amt ELSE 0  END) AS succ_amt
FROM (SELECT tx_dt tx_dt, sale_cnl sale_cnl, ord_sts , COUNT(*) tx_num, IFNULL(SUM(amt),0) tx_amtFROM t_order WHERE tx_dt = '20210421'GROUP BY sale_cnl, ord_sts
) t GROUP BY t.sale_cnl


1.最外面的sum无需空处理, 因为里面一层的子查询已做ifnull处理就不会出现空。
2.行转列最关键的是在于casewhen,作用是根据ord_sts的值进行分类,将每个销售员的数据行的列做了转换,在新的列(比如fail_num)里面只有一行是原来的值其余的都是0,接下来与第一步简单的group by进行sum()就可以了(用max()代替sum() 结果都一样因为只有一行不是0)。

sql查询 列转成一行相关推荐

  1. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  2. linux awk 某一列合并,利用shell中awk和xargs以及sed将多行多列文本中某一列合并成一行...

    一.问题描述 最近需要利用Shell将多行多列文本中某一列,通过指定的分隔符合并成一行.假设需要处理的文本如下: 我们主要处理的是,将用户名提取处理,合并成一行,并通过逗号进行分隔.最终的格式如下: ...

  3. EXCEL之将某列合并成一行并用逗号隔开

    今天在准备数据的时候因为写XML文件中的字段值比较麻烦,所以先把需要的字段值从数据库导出到excel中,并合并成一行,用逗号隔开,然后直接粘贴到XML文件中. 将下图中字段名对应的字段值代换为数据库中 ...

  4. mysql双竖线合并_MySql 将查询结果多列合并成一行GROUP_CONCAT

    GROUP_CONCAT(expr) 该函数返回带有来自一个组的连接的非NULL值的字符串结果.其完整的语法如下所示: GROUP_CONCAT([DISTINCT] expr [,expr ...] ...

  5. sql查询id最大的一行_mysql-聚合查询

    如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗? 这个方法当然可以,但是比较弱智.对于 ...

  6. SSIS 执行变量中的脚步输出列顺序与SQL查询列顺序不同

    这个问题是朋友遇到的,做一个SSIS的程序将数据导入到txt.然后再用Oracle的工具导入到Oracle.但是在SSIS中执行变量脚步的时候,发现输出的列名称跟查询的列名称完全不同.比如Schema ...

  7. sql 查询列 进行 拼接 单引号 逗号_xml path excel

    方法一: SELECT[id] = stuff((SELECT distinct',''' + user.id + ''''FROMt_user userWHERE 1=1FOR xml path ( ...

  8. sql 多行转成一行

    例如表A id     data 1      A 1      B 1      C 2      D 2      F 转换成表B 1     A+B+C 2     D+E smerg是自定义函 ...

  9. SQL查询集合合并成字符串

    有时候需要查询某一个字段,并把查询结果组成一个字符串,则: DECLARE @str varchar(2000) SELECT @str=isnull(@str+',','')+列名 FROM 表名 ...

最新文章

  1. 【SpringMVC】基本概念
  2. plotly可视化绘制多子图(subplots)共享坐标轴
  3. matlab三角形旋转动态,新手向!用WebGL写一个旋转的动态三角形,总共分三步!!(注释超详细!!)...
  4. HDU 1427 速算24点
  5. 最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这
  6. 计算机专业考研末流211和双非,211大学考985研究生难吗,如何看待本科985学生读研去211学校?...
  7. http://circles.arenaofthemes.com/
  8. Django中的富文本编辑器的使用
  9. html table自动序号,layui 给数据表格加序号的方法
  10. html汉字间的间距,div字间距-div内文字之间间距设置方法
  11. win10防火墙推荐设置来保护计算机,win10提示windows防火墙没有法更改某些设置如何办?...
  12. 关于TextView中修改部分字体颜色、大小方法的总结
  13. TCP/UDP、TCP/IP区别
  14. 计算机中的速率、带宽、时延、利用率解读
  15. 美国零售业发展强劲:2019愿景向好?
  16. 最新的 Sublime 激活码
  17. java调用插件_从任何java应用程序调用自己的eclipse插件方法
  18. 【造轮子】实现 atoi、itoa 函数
  19. 用os模块实现python文件名批量操作-简单版
  20. vue基础之常用特性

热门文章

  1. 免费关键词挖掘工具-python关键词挖掘工具源码
  2. 介绍chrome的一些不为人知的功能
  3. android studio release包安装后打不开,debug包安装正常怎么解决
  4. 马化腾2018中国“互联网+”数字经济峰会演讲《互联网+助力数字中国建设》全文...
  5. 图像处理;C++求已知两直线方程交点
  6. 京东面试官总结2020京东Java面试题,让你轻松拿下offer!
  7. 计算机教师面试题模板,教师资格证面试-小学信息技术试讲稿模板
  8. Word中插入Visio留空太大怎么办
  9. vue+mintui+picker弹框选择器
  10. Leon‘s Life