sql查询横排
发布网友
发布时间:2022-04-30 18:31
我来回答
共9个回答
热心网友
时间:2022-04-10 12:02
静态的,假设统计类别就只有:伙食费、培训费两种
select 姓名,
max(case 统计类别 when '培训费' then moneys else 0 end) 培训费,
max(case 统计类别 when '伙食费' then moneys else 0 end) 伙食费
from
(
select 姓名,sum(金额) moneys, 统计类别
from 表1
group by 姓名,统计类别
) tb
group by 姓名
----
动态的,统计类别不固定
declare @sql varchar(8000)
set @sql = 'select 姓名'
select @sql = @sql + ' , max(case 统计类别 when ''' + 统计类别 + ''' then moneys else 0 end) [' + 统计类别 + ']' from (select distinct 统计类别 from 表1) as a
set @sql = @sql + ' from (select 姓名,sum(金额) moneys, 统计类别 from 表1 group by 姓名,统计类别) group by 姓名'
exec(@sql)
热心网友
时间:2022-04-10 13:20
用动态SQL,否则解决不了姓名和类别的不确定性!
我不知道你的表结构,语句中用到的表是[T1],列分别是[类别]、[姓名]、[金额],可以根据你的实际情况替换。
上代码:
declare @SQL varchar(8000)
set @SQL =''
select @SQL =@SQL +'select 姓名 '
select @SQL =@SQL +'
,sum (case when 类别='''+类别+'''then 金额 else 0 end) as ['+类别+']' from (select distinct 类别 from T1 )t
select @SQL =@SQL +'
,sum(金额) 总计
from T1
group by 姓名'
print @sql
exec(@sql)
热心网友
时间:2022-04-10 14:55
create table test
(
name nvarchar(20),
mony int,
class nvarchar(20)
)
insert into test values('张三','200','培训费')
insert into test values('张三','100','伙食费')
select name,sum(mony) 金额,max(case class when '培训费' then mony end) 培训费,
max(case class when '伙食费' then mony end) 伙食费
from test
group by name
热心网友
时间:2022-04-10 16:46
这个其实用到一个交叉表的功能
--执行示例
exec sp_cross_table '表1','姓名','统计类别','金额'
--交叉表 存储过程
create PROCEDURE sp_cross_table(
@T1 VARCHAR(30),@T2 VARCHAR(30),
@T3 VARCHAR(30),@T4 VARCHAR(30)) AS
--T1 表名,T2,T3是交叉表的两上分类字段,T4是汇总字段
--T2是行字段,T3列字段
BEGIN
DECLARE @SQL VARCHAR(7999),@FIELD VARCHAR(30)
SELECT @SQL='SELECT DISTINCT '+@T3+' FROM '+@T1
CREATE TABLE #FIELD(FIELD VARCHAR(30))
--将列字段提取到临时表#FIELD中
INSERT INTO #FIELD EXEC(@SQL)
SELECT @SQL='CREATE TABLE CROSS_TEST('+@T2+' VARCHAR(30),'
DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT * FROM #FIELD
OPEN CUR_FIELD
FETCH CUR_FIELD INTO @FIELD
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @FIELD='['+@FIELD+']'
SELECT @SQL=@SQL+@FIELD+' DECIMAL(8,2) DEFAULT 0,'
FETCH CUR_FIELD INTO @FIELD
END
SELECT @SQL=LEFT(@SQL,LEN(@SQL)-1)+')'
--创建临时交叉表CROSS_TEST
EXEC(@SQL)
SELECT @SQL='INSERT INTO CROSS_TEST('+@T2+') SELECT DISTINCT '+@T2+' FROM '+@T1
--将行数据存入交叉表#CROSS_TEST
EXEC(@SQL)
--创建分组数据表TEMP
SELECT @SQL='CREATE TABLE TEMP('+@T2+' VARCHAR(30),'+@T3+' VARCHAR(30),'+@T4+' DECIMAL(8,2))'
EXEC(@SQL)
--将交叉汇总数据放入交叉表
SELECT @SQL='SELECT '+@T2+','+@T3+', SUM('+@T4+') '+@T4+' FROM '+@T1 +' GROUP BY '+@T2+','+@T3
INSERT INTO TEMP EXEC(@SQL)
--将汇总数据写入交叉表
DECLARE CUR_SUM CURSOR LOCAL FOR SELECT * FROM TEMP
DECLARE @F1 VARCHAR(30),@F2 VARCHAR(30),@QTY DECIMAL(8,2),@Q1 VARCHAR(30)
OPEN CUR_SUM
FETCH CUR_SUM INTO @F1,@F2,@QTY
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @F2='['+@F2+']',@Q1=CAST(@QTY AS VARCHAR(30))
SELECT @SQL='UPDATE CROSS_TEST SET '+@F2+'='+@Q1+' WHERE '+@T2+'='''+@F1+''''
EXEC(@SQL)
FETCH CUR_SUM INTO @F1,@F2,@QTY
END
CLOSE CUR_SUM
SELECT * FROM CROSS_TEST
DROP TABLE TEMP
DROP TABLE CROSS_TEST
DROP TABLE #FIELD
END
热心网友
时间:2022-04-10 18:54
select a.姓名,a.培训费,b.伙食费 from(select 姓名,sum(金额)as 培训费 from 表1 where 统计类别=‘培训费’group by 姓名,统计类别)a join (select 姓名,sum(金额)as 伙食费 from 表1 where 统计类别=‘伙食费’group by 姓名,统计类别)b on a.姓名=b.姓名
热心网友
时间:2022-04-10 21:19
select 姓名,
sum(case 类别 when '培训费' then 金额 else 0 end)'培训费',
sum(case 类别 when '伙食费' then 金额 else 0 end)'伙食费'
from 表1 group by 姓名
热心网友
时间:2022-04-11 00:00
在 SQL2005 及以上版本使用行转列或列转行
http://hi.baidu.com/%CA%B7%C9%CF%D7%EE%C7%BF%B5%C4%B6%B9%BB%A8/blog/item/27734aec5af1192527979145.html
热心网友
时间:2022-04-11 02:58
把你第一的结果放到临时表,然后查临时表
select 姓名,SUM(case when 统计类别 = '培训费
' then 数量列 else 0 end) as 培训费, SUM(case when 统计类别 = '伙食费
' then 数量列 else 0 end) as 伙食费 from 临时表 group by 姓名
热心网友
时间:2022-04-11 06:13
select 姓名,培训费,统计类别
from 表1
group by 姓名,统计类别
where 统计类别='伙食费'