sql行转列

SQL Server行转列

醉酒当歌 提交于 2019-12-06 02:48:26
在很多情况下需要查询出来的数据进行行转列,看如下的例子,#t是一个临时表,可以换成真实存在的表: --头部信息,这部分不参与行转列DECLARE @SqlText NVARCHAR(4000)='SELECT DeviceName 货机名称, DeviceAddress 货机地址,CONVERT(VARCHAR(10), ReplenishmentCreatedDate, 20) 时间, ' -- SQL头部分 SELECT --行转列如下:可以重命名字段名,列头用其中一个列生成,列信息用另一个字段的信息,可以让多列数据信息转换 SELECT @SqlText = @SqlText + ' SUM(CASE WHEN GoodsName=''' + GoodsName + ''' THEN ISNULL(ReplenishmentTotalQuantity, 0) END) ''' + GoodsName + '(上货[件])'',' + ' SUM(CASE WHEN GoodsName=''' + GoodsName + ''' THEN ISNULL(PickUpTotalQuantity,0) END) ''' + GoodsName + '(下货[件])'',' FROM (SELECT DISTINCT GoodsName FROM #t) T -- 拼接CASE

行转列且是多表头处理的解决方案

时光毁灭记忆、已成空白 提交于 2019-12-06 02:03:13
最近又在处理一个多表头且是行转列的报表,有一个小小的技巧我一直都不记得,以前用过,长时间不了又忘记了。还是放上来做一个记录吧 第一步: 通过计算得到一个临时表,表名是动态的 表 1+@uid 例如字段有 列1,列2,列3,数量 第二步: 假如将列3中的行记录变成列. 如果此时的表名是固定的话,下面这一步可以跳开,如果不是,刚需要新建一个表,这个小技巧要注意,对于产生的数据表名称不固定时用这种方法应该还是比较有用的。(这种表名不固定存在的意义是为了防止多个人同时对同一报表查询时会产生数据冲突。所以一般在临时表名后加上登陆ID) 把列3的行记录加入这个表中(注意不要把重复值加入group by ), 如 insert into 表2 (uid,列3) select @uid,列3 from 表 1+@uid group by 列3 第三步:这个方法网上已经是流传了很久了,感谢当初的分享者。 declare @sql varchar(8000) set @sql = 'select 列1,列2,' /*下面的这段是关键的*/ select @sql = @sql+'sum(case 列3 when '''+dt.列3+''' then 数量 else 0 end) '''+dt.列3+''',' from (select top 100 percent 列3 from 表2 where

mysql行转列

孤街浪徒 提交于 2019-12-06 01:57:48
在固定列的情况下,可以group by后把每个列要显示的数据通过if指定写到sql里: ... SUM(IF(条件,输出的列,默认值)), SUM(IF(条件,输出的列,默认值)) ... group by xxx ... 在动态列的情况,可以使用预编译: 1,先用group_concat将动态行转出一行赋值给变量 2,然后用多个变量组装成最后要执行的sql,再执行 SET @SQL_1 = ( SELECT GROUP_CONCAT(',',subject_name) FROM subject GROUP BY ... ); SET @SQL_ALL = CONCAT(' select ... ',@SQL_1,'...'); --SET @SQL_2 =... --SET @SQL_ALL = CONCAT_WS(' UNION ALL ',@SQL_1,@SQL_2); PREPARE stmt FROM @SQL_ALL; EXECUTE stmt; DEALLOCATE PREPARE stmt; 来源: CSDN 作者: 山间明月江上清风_ 链接: https://blog.csdn.net/u011870280/article/details/100743281

Oracle行转列

杀马特。学长 韩版系。学妹 提交于 2019-12-03 14:45:01
如果是oracle 10g以上 一个wm_concat函数就可以解决。 如果是oracle 9i以下就有点麻烦了。 表结构如下: NAME Null Type N_SEC_CODE NOT NULL CHAR(6) C_RESEARCHER_CODE NOT NULL VARCHAR2(20) 此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员 对其进行跟踪研究。所以目前遇到一个要求,需查询出每只股票和对应的研究员(研究员代码间,使用逗号分隔)。 例如有如下数据: 000297 chenpeng 000297 liusu 合并处理后需显示为: 000297 chenpeng,liusu 网上查了很多方法,但通常而言都是编写自定义多行文本合并函数,或者对支持的列数具有局限性。 最后在英文google中搜到如下比较巧的方法。不用在数据库中增加function,纯SQL一次性搞定, 而且扩充性很好,没有列的限制。 ORACLE纯SQL实现多行合并一行 - 南乡子 - 旅夜书怀ORACLE纯SQL实现多行合并一行 - 南乡子 - 旅夜书怀Code SELECT n_sec_code, TRANSLATE (LTRIM (text, '/'), ' /', ' ,') researcherList FROM (SELECT ROW_NUMBER ()

Sql Server 行转列

匿名 (未验证) 提交于 2019-12-02 23:49:02
原文链接: http://www.cnblogs.com/Jackie-sky/p/5784402.html Sql Server行转列示例: --创建 部门表,写入数据 create table Table_Dep( depid varchar ( 10 ), dname varchar ( 50 ) ) insert into Table_Dep values ( ' 1 ' , ' 国内业务一部 ' ) insert into Table_Dep values ( ' 2 ' , ' 国内业务二部 ' ) insert into Table_Dep values ( ' 3 ' , ' 国内业务三部 ' ) insert into Table_Dep values ( ' 4 ' , ' 国际业务部 ' ) --创建 业绩表,写入数据 create table Table_Yeji( mon varchar ( 20 ), depid varchar ( 20 ), yj varchar ( 30 ) ) insert into Table_Yeji values ( ' 一月份 ' , ' 1 ' , ' 10 ' ) insert into Table_Yeji values ( ' 一月份 ' , ' 2 ' , ' 10 ' ) insert into Table

SqlServer行转列

匿名 (未验证) 提交于 2019-12-02 23:42:01
参考 : https://www.cnblogs.com/johden2/p/5692765.html 例子演示 测试数据 /*-----1.行转列的测试数据--------------------------*/ IF OBJECT_ID('tbScore') IS NOT NULL DROP TABLE tbScore GO CREATE TABLE tbScore ( 姓名 VARCHAR(10) , 课程 VARCHAR(10) , 分数 INT, 日期 DATETIME ) GO INSERT INTO tbScore VALUES ( '张三', '语文', 74,GETDATE() ) --INSERT INTO tbScore VALUES ( '张三', '数学', 83 ,GETDATE() ) INSERT INTO tbScore VALUES ( '张三', '物理', 93 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '语文', 74 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '数学', 84 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '物理', 94 ,GETDATE() ) GO /*----

通过sql实现动态行转列

匿名 (未验证) 提交于 2019-12-02 23:38:02
上一章我们讲了固定行转列,本章我们就将一下怎么动态实现行转列的。因为有时候需要行专列的值有成千上万条,不可能再用固定行转列的方法,否则你一定会崩溃掉的。好了,废话不多说,开始吧! 常见一张表tmp_test,内容如下: 实现代码: create or replace procedure p_test is v_sql varchar2(2000); cursor cursor_1 is select distinct subject from tmp_test order by subject; begin v_sql := 'select username'; for v_subject in cursor_1 loop v_sql := v_sql || ',' ||'sum(decode(subject,''' ||v_subject.subject ||''',source)) as ' ||v_subject.subject; dbms_output.put_line(v_sql); end loop; v_sql := vql || ' from tmp_test group by username'; dbms_output.put_line(v_sql); v_sql := 'create or replace view test_result as ' || v

sql的行转列(PIVOT)与列转行(UNPIVOT)

只谈情不闲聊 提交于 2019-12-01 07:02:58
在做数据统计的时候,行转列,列转行是经常碰到的问题。case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一、行转列 1、测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SELECT '张三', '语文', 80 INSERT INTO [StudentScores] SELECT '张三', '数学', 90 INSERT INTO [StudentScores] SELECT '张三', '英语', 70 INSERT INTO [StudentScores] SELECT '张三', '生物', 85 INSERT INTO [StudentScores] SELECT '李四', '语文', 80 INSERT INTO [StudentScores] SELECT '李四', '数学', 92 INSERT INTO [StudentScores] SELECT '李四', '英语', 76 INSERT INTO [StudentScores]

JAVA面试宝典

我只是一个虾纸丫 提交于 2019-11-30 23:13:26
转载自: https://www.cnblogs.com/lyldaisy/p/10952180.html 1、 meta标签的作用是什么 2、 ReenTrantLock可重入锁(和synchronized的区别)总结 3、 Spring中的自动装配有哪些限制? 4、 什么是可变参数? 5、 什么是领域模型(domain model)?贫血模型(anaemic domain model)和充血模型(rich domain model)有什么区别? 6、 说说http,https协议 7、 "= ="和equals方法究竟有什么区别? 8、 &和&&的区别? 9、 .super.getClass()方法调用? 10、 10条SQL优化技巧 11、 10道经典java面试题_实习生必问! 12、 15个Java线程并发面试题和答案 13、 15个高级Java多线程面试题及回答 14、 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 15、 2018年java分布式相关最新面试题 16、 2018最新java技术面试题与答案 17、 23种经典设计模式都有哪些,如何分类? 18、 4个Spring常见面试题及答案解析 19、 58到家MySQL数据库开发规范 20、 9条改善Java性能的小建议 21、 9道常见的java笔试选择题 22、

经典SQL问题: 行转列

房东的猫 提交于 2019-11-30 15:12:02
学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键。本文以MySQL为基础,其他数据库会有些许语法不同。 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: SELECTDISTINCT a.name, (SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='语文')AS'语文', (SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='数学')AS'数学', (SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='英语')AS'英语' FROMgrade a 方法二: SELECTname, SUM(CASE courseWHEN '语文'THENscoreEND)AS'语文', SUM(CASE courseWHEN '数学'THENscoreEND)AS'数学', SUM(CASE courseWHEN '英语'THENscoreEND)AS'英语' FROMgradeGROUPBYname 方法三: DELIMITER && CREATE PROCEDURE sp_count() BEGIN #课程名称