假设表有A,B两列,代码如下
selectA,LISTAGG(B,',')WITHINGROUP(ORDERBYB)BfromtablegroupbyA
上面SQL文可将B列横向输出,以逗号分割,输出顺序按B的值升序排列
⑵ 在sql里,如何将横向数据改成纵向数据结构
您好,行列转换等经典SQL语句
参考资料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx
1.--行列转换
原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90
转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0
实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1
实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
⑶ sql如何自动实现更新,竖表变横表,是要用触发器还是别的方法实现,具体代码如何写
先给你讲一下你说的横表变竖表,其实就是行列转换,我写个例子给你看看:
列转行
录入经营范围时候会遇到列传行的问题解决方案如下:
在temp1 表有一下字段内容:
⑷ 动态Sql语句实现横表转竖表,成绩转成列
select @sql1 = @sql1 + ' , max(case CouName when ''' + CouName + ''' then Score else NULL end) 这里写错了,应该是
select @sql1 = @sql1 + ' , max(case when CouName =''' + CouName + ''' then Score else NULL end) CouName
然后后面少了group by 学号,姓名行转列后面一定要把不转的列group 出来
⑸ sql 横表变竖表 动态语句怎么写
1、首先 日期没有出现在Group里
2、其次,组成动态的【,isnull(sum(...))】没有去掉最前面的那个逗号
3、感觉这个语句肯定不会执行成功,最好你把表结构给出,并且给出示例结果来。
⑹ 求将横表转为竖表的SQL语句 如图:
select stuno,stuname,marks1 from TB_test
union all select stuno,stuname,marks2 as marks1 from TB_test
union all select stuno,stuname,marks3 as marks1 from TB_test
union all select stuno,stuname,marks4 as marks1 from TB_test
⑺ SQL sever中将横表转纵表时的这段代码是什么意思,可以详细解释一下吗
查询每个 name 中 语文 的最大 result 值,如果 语文 的 result 没有值,则返回0;
其他数学、物理原理一样;
⑻ SQL 将横向数据汇总后转为纵向
select a.*,
sum(case b.种类 when ZA then isnull(数量,0) else 0 end) as ZA,
sum(case b. 种类 when ZB then isnull(数量,0) else 0 end) as ZB,
sum(case b.种类 when ZC then isnull(数量,0) else 0 end) as ZC, from 表1 a,表2 where a.单号=b.单号
⑼ 求SQL语句,报表横向转纵向,貌似有交叉,感谢!
SELECT 年份,月份,部门编码,SUM(CASE WHEN 支出项目='人员费' AND 费用分类='直接' THEN 金额 ELSE 0 END) 人员费直接成本,
SUM(CASE WHEN 支出项目='人员费' AND 费用分类='间接' THEN 金额 ELSE 0 END) 人员费间接成本,
SUM(CASE WHEN 支出项目='水电费' AND 费用分类='直接' THEN 金额 ELSE 0 END) 水电费直接成本,
SUM(CASE WHEN 支出项目='水电费' AND 费用分类='间接' THEN 金额 ELSE 0 END) 水电费间接成本,
SUM(CASE WHEN 支出项目='其他费' AND 费用分类='直接' THEN 金额 ELSE 0 END) 其他费直接成本,
SUM(CASE WHEN 支出项目='其他费' AND 费用分类='间接' THEN 金额 ELSE 0 END) 其他费间接成本
FROM 表
GROUP BY 年份,月份,部门编码
⑽ SQL 将横向数据转为纵向记录
使用union连接SQL语句,可以实现常见的SQL行转列运用。
以图中表格为例:
需要注意,如果有需要显示重复记录,把union 改成 union all