问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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 统计类别='伙食费'
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我的眉毛中部有几根会往上翘有什么说法吗? 儿童补铁的药哪种效果最好? 儿童补铁口服液哪个牌子好 台湾的共享单车有人用过吗,想知道他们用的哪款车坐垫用的是哪家的,和... city bike和roadbike区别 报春花怎样扦播 电脑连接上无线网络不能上qq为什么电脑连上无线网却只能登qq 能上网但是不能上qq,是什么原因? 金山网盾、金山网镖、金山毒霸、金山清理专家四个软件哪个防护好一点... 上网的时候,金山网镖、金山网盾和金山毒霸这三个程序需要都开着吗? VB32与VB64的区别 还是Matlab程序问题 市场规模与产业规模分别是什么意思? mysql存储过程中光标所指向的记录在打开光标之前可以改变吗 关于SQL数据汇总求助 市场容量是什么意思 相亲对象给你发我脑瓜子嗡嗡的,明天给你赔罪好不好女生应该怎么回答他? 市场上出现“物以稀为贵”现象的原因可能是 A.商品过剩 B.持币待购 C.供不应求 D.供过于 求一SQL语句 例如表数据为: A 3 B 2 C 4 理想输出为: A A A B B C C C C 脑瓜子嗡嗡的,老响,这是什么病? 买车返利是什么意思? 用js写个导航栏的红色线条,第一个显示,滑动到第二个显示,第一个消 斯维尔三维算量打开后,中间有一个光标,删不掉。怎么办 如图右下角。 CAD打开的时候十字光标是斜的怎么处理,我是天正转T3后光标变斜的,在天正里是正的 请求高手优化sql查询速度!!!!! 不分组查询很快,分组后超慢,求解决方法 微信群消息怎么屏蔽 如何不接群消息 ,男人说在翁翁是什么意思啊? 高分:分油问题,c++怎么编程? 怎样设置不接群消息 用友T3用友通标准版在建立新年度帐的时候提示“列名curgroupcol无效”,具体情况下付 用友T3 10.8PLUS1升级老版本数据库时提示 -2147217900 列名 iTaxUnitPrice 无效 烙筋饼用高筋面粉还是低筋面粉 什么是“口红效应”? C++ C语言程序设计 题目:贷款计算器 东北筋饼怎么做,用什么样的面粉做 Informix存储过程题(谁能解决,小弟万分感谢) 32位和64位是什么意思? 职能资本是什么意思? 汽车市场的‘井喷’指是什么? 制作筋饼用什么面粉好 想吃榆林筋饼自己在家怎么做? 怎样和面可以使筋饼即软又劲道? 依莹这名字意思还可以吗 姓易名依莹,给女孩起名怎么样 祝依莹生日快乐藏头诗 段依莹名字能打多少分 我的外甥女 农历2010年四月十七下午14:43分生 取名武依莹 可以吗? 梦幻西游起名:′依莹飘絮 如果改成和这个类似的名字 有没有其他好听的 没有权限看别人的qq空间,怎么办 歌词里面有一句“我给大家拜年了,我们一起许一个,美丽的愿望”