一、第一种

  原数据表

  

  转换后

  

  1. DROP TABLE IF EXISTS tempdynamic;
  2. CREATE TEMPORARY TABLE tempdynamic (
  3. SELECT p.fsPaymentName,sr.fsPaymentId,sh.fsShiftName,SUM(sr.fdReceMoney) as AmtTotal FROM tbsell as s
  4. INNER JOIN tbSellReceive as sr ON s.fsSellNo=sr.fsSellNo AND s.fsShopGUID=sr.fsShopGUID
  5. INNER JOIN tbpayment as p on sr.fsPaymentId =p.fsPaymentId and p.fsShopGUID=s.fsShopGUID and p.fiStatus=1
  6. INNER JOIN tbSellCheck as sc on sc.fsSellNo=s.fsSellNo AND s.fsShopGUID=sc.fsShopGUID
  7. INNER JOIN tbshift as sh ON sc.fsShiftId=sh.fsShiftId AND sh.fiStatus=1
  8. WHERE s.fiBillStatus=3
  9. AND s.fsShopGUID='c5f0d5c9d8b349f493c180bcc22d9ce0'
  10. AND s.fsSellDate='2016-01-15'
  11. GROUP BY sr.fsPaymentId,sc.fsShiftId);
  12.  
  13. SET @EE='';
  14. set @str_tmp='';
  15.  
  16. SELECT @EE:=CONCAT(@EE,'SUM(IF(fsShiftName=\'',fsShiftName,'\'',',AmtTotal,0)) AS ',fsShiftName,',') as aa into @str_tmp
  17. FROM (
  18. SELECT DISTINCT fsShiftName from tempdynamic
  19. ) A order by length(aa) desc limit 1;
  20.  
  21. SET @QQ=CONCAT('SELECT ifnull(fsPaymentName,\'total\') as 科目名称 ,',@str_tmp,' SUM(AmtTotal) as 合计 FROM tempdynamic Group by fsPaymentName WITH ROLLUP');
  22.  
  23. PREPARE stmt FROM @QQ;
  24. EXECUTE stmt ;
  25. deallocate prepare stmt;

  二、第二种

  原数据表

  

  转换后

  

  1. DROP TABLE IF EXISTS tempdynamic;
  2. CREATE TABLE tempdynamic (
  3. SELECT sh.fsShiftName,sh.fsShiftId, SUM(s.fdSaleAmt) as 销售金额,SUM(s.fdDiscountAmt) as 折扣金额, SUM(s.fdServiceAmt) as 服务费金额,SUM(s.fdExpAmt) as 应收金额 ,SUM(s.fdRealAmt) as 实收金额
  4. FROM tbsell as s
  5. INNER JOIN tbSellCheck as sc on sc.fsSellNo=s.fsSellNo AND s.fsShopGUID=sc.fsShopGUID
  6. INNER JOIN tbshift as sh ON sc.fsShiftId=sh.fsShiftId AND sh.fiStatus=1
  7. WHERE s.fiBillStatus=3
  8. AND s.fsShopGUID='c5f0d5c9d8b349f493c180bcc22d9ce0'
  9. AND s.fsSellDate='2016-01-15'
  10. GROUP BY sc.fsShiftId);
  11.  
  12. DROP TABLE IF EXISTS tempdynamica;
  13. CREATE TEMPORARY TABLE tempdynamica(
  14. SELECT a.* FROM (
  15. SELECT fsShiftName,'销售金额' AS 科目,销售金额 AS AmtTotal FROM tempdynamic UNION ALL
  16. SELECT fsShiftName,'折扣金额' AS 科目,折扣金额 AS AmtTotal FROM tempdynamic UNION ALL
  17. SELECT fsShiftName,'服务费金额' AS 科目,服务费金额 AS AmtTotal FROM tempdynamic UNION ALL
  18. SELECT fsShiftName,'应收金额' AS 科目,应收金额 AS AmtTotal FROM tempdynamic UNION ALL
  19. SELECT fsShiftName,'实收金额' AS 科目,实收金额 AS AmtTotal FROM tempdynamic
  20. ORDER BY fsShiftName,科目 DESC) as a );
  21.  
  22. SET @EE='';
  23. set @str_tmp='';
  24. SELECT @EE:=CONCAT(@EE,'SUM(IF(fsShiftName=\'',fsShiftName,'\'',',AmtTotal ,0)) AS ',fsShiftName,',') as aa into @str_tmp
  25. FROM (
  26. SELECT DISTINCT fsShiftName from tempdynamic
  27. ) A order by length(aa) desc limit 1;
  28. SET @QQ=CONCAT('SELECT ifnull(科目,\'total\') as 科目名称,',@str_tmp,'sum(AmtTotal) as 合计 FROM tempdynamica Group by 科目 WITH ROLLUP');
  29. PREPARE stmt FROM @QQ;
  30. EXECUTE stmt ;
  31. deallocate prepare stmt;

postgresql

  原数据:

  

  转换后:

  

  sql:

  

  1. CREATE OR REPLACE FUNCTION "public"."test"()
  2. RETURNS "pg_catalog"."void" AS $BODY$
  3. DECLARE
  4. dynsql1 VARCHAR ;
  5. dynsql2 VARCHAR ;
  6. dynsql3 VARCHAR ;
  7. BEGIN
  8. drop table if exists temp_sell;
  9. dynsql1='CREATE TEMP TABLE temp_sell AS SELECT
  10. bd.area_id,
  11. bd.area_name,
  12. bd.sell_date,
  13. SUM (
  14. COALESCE (bss.original_amt, 0)
  15. ) AS original_amt
  16. FROM
  17. bill_detail AS bd
  18. INNER JOIN bill_settlement_summary AS bss ON bd.bill_id = bss.bill_id
  19. WHERE
  20. bd.sell_date BETWEEN ''2018-01-01''
  21. AND ''2018-01-30''
  22. AND bd.shop_guid=''143174''
  23. -- AND area_id=''''
  24. -- AND msection_id=''''
  25. GROUP BY
  26. bd.sell_date,
  27. bd.area_id,
  28. bd.area_name;';
  29. EXECUTE dynsql1;
  30. dynsql2 = '';
  31. dynsql3 = '';
  32. drop table if exists temp_sell_1;
  33. CREATE TEMP TABLE temp_sell_1 AS
  34. SELECT concat('SUM(CASE WHEN sell_date=''',sell_date,'''','then original_amt else 0 end) AS "',sell_date,'"') AS aa
  35. FROM
  36. (SELECT DISTINCT
  37. sell_date
  38. FROM
  39. temp_sell) A
  40. ORDER BY sell_date ASC ;
  41. SELECT string_agg(aa, ',') INTO dynsql2 from temp_sell_1;
  42. RAISE NOTICE 'dynsql2==[%]', dynsql2 ;
  43. dynsql3 = CONCAT(
  44. 'SELECT area_id as 区域id,area_name as 区域名称,' ,dynsql2,
  45. ',sum(original_amt) 汇总 FROM temp_sell Group By area_id,area_name;'
  46. );
  47. RAISE NOTICE 'dynsql3==[%]', dynsql3 ;
  48. END ;
  49. $BODY$
  50. LANGUAGE 'plpgsql' VOLATILE COST 100
  51. ;
  52. SELECT test();
  53. SELECT area_id as 区域id,area_name as 区域名称,SUM(CASE WHEN sell_date='2018-01-12'then original_amt else 0 end) AS "2018-01-12",SUM(CASE WHEN sell_date='2018-01-18'then original_amt else 0 end) AS "2018-01-18",SUM(CASE WHEN sell_date='2018-01-19'then original_amt else 0 end) AS "2018-01-19",SUM(CASE WHEN sell_date='2018-01-25'then original_amt else 0 end) AS "2018-01-25",sum(original_amt) 汇总 FROM temp_sell Group By area_id,area_name;

  

第二种方案:

参考: http://www.cureffi.org/2013/03/19/automatically-creating-pivot-table-column-names-in-postgresql/

使用函数如下:

  1. CREATE OR REPLACE FUNCTION "public"."pivotcode"("tablename" varchar, "rowc" varchar, "rowctype" varchar, "groupby" varchar, "colc" varchar, "cellc" varchar, "celldatatype" varchar)
  2. RETURNS "pg_catalog"."void" AS $BODY$
  3. DECLARE rec record ; dynsql1 VARCHAR ; dynsql2 VARCHAR ; countrows INT; columnlist VARCHAR ;
  4. BEGIN
  5. drop table if exists temp_sell_result;
  6. dynsql1 = 'select count(1) from ' || tablename || ';' ;
  7. EXECUTE dynsql1 INTO countrows ;
  8. IF countrows=0 THEN
  9. dynsql1='CREATE TEMP TABLE temp_sell_result AS select * from ' || tablename || ';';
  10. EXECUTE dynsql1;
  11. ELSE
  12. -- 1. retrieve list of column names.
  13. dynsql1 = 'select string_agg(distinct ''"''||' || colc || '||''" ' || celldatatype || ''','','' order by ''"''||' || colc || '||''" ' || celldatatype || ''') from ' || tablename || ';' ;
  14. --RAISE NOTICE '%', dynsql1 ;
  15. EXECUTE dynsql1 INTO columnlist ;
  16. -- 2. set up the crosstab query
  17.  
  18. dynsql2 = 'CREATE TEMP TABLE temp_sell_result AS select * from crosstab (
  19. ''select ' || rowc || ',' || colc || ',' || cellc || ' from ' || tablename || ' group by '||groupby||' order by '||groupby||''',
  20. ''select distinct ' || colc || ' from ' || tablename || ' order by 1''
  21. )
  22. as newtable (
  23. ' || rowctype || ',' || columnlist || '
  24. );' ;
  25. EXECUTE dynsql2 ;
  26. END IF;
  27. END ;
  28. $BODY$
  29. LANGUAGE 'plpgsql' VOLATILE COST 100
  30. ;
  31.  
  32. ALTER FUNCTION "public"."pivotcode"("tablename" varchar, "rowc" varchar, "rowctype" varchar, "groupby" varchar, "colc" varchar, "cellc" varchar, "celldatatype" varchar) OWNER TO "winposdev";

Mysql postgresql 行列转换的更多相关文章

  1. Mysql实现行列转换

    前言: 最近又玩起了sql语句,想着想着便给自己出了一道题目:“行列转换”.起初瞎折腾了不少时间也上网参考了一些博文,不过大多数是采用oracle数据库当中的一些便捷函数进行处理,比如”pivot”. ...

  2. MySQL中行列转换的SQL技巧

    行列转换常见场景 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列 ...

  3. Mysql 逗号分隔行列转换总结

    方法一 存储过程实现: -- 修改结束符,防止在mysql命令行中默认分号直接运行 delimiter $$ -- 创建一个计算拆分后字符串的个数函数 drop function if exists ...

  4. postgresql行列转换

    --安装扩展 CREATE EXTENSION tablefunc --使用CROSSTAB函数 SELECT * FROM CROSSTAB('SELECT 主键, 需转换的列名, 需转换的列值 F ...

  5. mysql:sql行列转换

    今天一个同学遇到一个问题问我了,由于本人平时学习的mysql比较基础,确实没解决,后来google了一下,才知道是sql的一种技法[行列转换],话不多说先上图: 想得到下面的结果: +------+- ...

  6. MySQL行列转换

    分类: Mysql/postgreSQL 在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义.http://topic.csdn.net/u ...

  7. 【学亮IT手记】MySql行列转换案例

    create table score( name ), math int, english int ); ,); ,); ,); ,); SHOW tables; SELECT * from scor ...

  8. 简单的叙述下SQL中行列转换的小知识!

    行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法, 可能网上已经有很多类似的方法了,有的 ...

  9. Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象

    前言 在上一篇文章中(Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库)[https://www.cnblogs.com/viter/p/10243577.html],介 ...

随机推荐

  1. [HASH]MOD运算用户哈希函数

    一.概述 MOD(取模)运算配合质数的特性,可以实现一种简单的哈希算法. 二.基于的定理 在理解如何实现mod哈希前应当了解一些数学的定理: 1.x mod y = z ,实际上是x除以y的余数y的意 ...

  2. css3兼容360

    在头部添加 <!--启用360浏览器的极速模式(webkit) --> <meta name="renderer" content="webkit&qu ...

  3. QT安装后再添加或删除组件

    QT安装目录下打开MaintenanerceTool.exe 手动添加​储存库,要定位一个储存有QT在线安装镜像的网址: https://download.qt.io/online/qtsdkrepo ...

  4. Jmeter(1)介绍

    JMeter是什么东西 Jmeter(Apache JMeter)是一个100%基于JAVA的应用程序,它的功能是 分析和衡量 web应用程序和各种服务的性能和负载能力 Jmeter不是一个浏览器,它 ...

  5. 百度 Javascript开发 API

    一.在手机wap上滑动地图,标准点在最中心位置 map.getCenter() 1.当移动地图时,点同时移动,获取屏幕中心点 <!DOCTYPE html> <html> &l ...

  6. Oracle-分析函数之sum(...) over(...)

    概述 Oracle函数 很久之前更新了一篇Oracle的函数博文http://blog.csdn.net/yangshangwei/article/details/51425458,分析函数并没有包括 ...

  7. AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

    在日常系统工作中,我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析,但是在很多情况下都是被动的在出问题后才会去查日志.在很多时候,我们可能更需要相对实时的了解整个系统或者某一时段的运行的 ...

  8. CentOS6.x 下 /etc/security/limits.conf 被改错的故障经历

    Intro 我司本小厂,每个员工都是身兼数职,所以开发人员直接登录线上服务器改东西是常态.有些开发人员,自持水平较高(的确水平也是较高,但缺乏对系统的敬畏),所以总是越俎代庖,改一些本身应该是线上运维 ...

  9. mongDB数据库 小白学习

    一  安装配置 1.配置文件mongod.cfg (路径:D:\data\config\mongod.cfg) 如下: systemLog: destination: file path: D:\da ...

  10. DbHelperSQL 增加事务处理方法(2种)

    方法一: 1 public static bool ExecuteSqlByTrans(List<SqlAndPrams> list) { bool success = true; Ope ...