怎么将纵向的数值转换为横向的数值。

qq_32320747 2018-03-23 08:33:22

然后把数据转换为列头是应发奖金,这些。下面是Moneys。SQL有办法这样子做吗?
...全文
1303 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2018-03-23
  • 打赏
  • 举报
回复

if not object_id(N'Tempdb..#RecordsMoneys_Add') is null
    drop table #RecordsMoneys_Add
Go
Create table #RecordsMoneys_Add
(id int identity(1,1),
moneyid varchar(10),
itemname nvarchar(50)
,moneys decimal(12,2))

Insert #RecordsMoneys_Add
select '243','应发奖金',243 union all
select '242','应发奖金',4514 union all
select '242','药比超标罚款',-111 union all
select '242','转院床目超标罚款',-44 union all
select '242','处方扣款',-333 union all
select '242','医保或药剂扣款',0 union all
select '240','应发奖金',0 union all
select '240','药比超标罚款',0 union all
select '240','转院床目超标罚款',0 union all
select '240','处方扣款',0 union all
select '240','医保或药剂扣款',0
Go

--如果这5列的列名固定
--先把行转列的结果生成一个结果集,然后再拿这个结果集代替整个拼接起来中的RecordsMoneys_Add表来进行处理。
with cte
as 
(select moneyid,
        sum(case when itemname='应发奖金' then moneys else 0 end) as '应发奖金',
        sum(case when itemname='药比超标罚款' then moneys else 0 end)  as '药比超标罚款',
        sum(case when itemname='转院床目超标罚款' then moneys else 0 end)  as '转院床目超标罚款',
        sum(case when itemname='处方扣款' then moneys else 0 end)  as '处方扣款',
        sum(case when itemname='医保或药剂扣款' then moneys else 0 end)  as '医保或药剂扣款'
 from #RecordsMoneys_Add
 group by moneyid)
 
SELECT a.months, b.dept_code ,b.dept_name ,
c.user_code , isnull(c.user_name,username) as user_name,a.moneys,e.tax
,a.userid,a.deptid,a.id,a.RecordUser,a.RecordTime,a.iscw,a.isExtra
FROM Records_Moneys  a 
inner join public_dept_list b on a.deptid=b.deptid
left outer join public_user_list c on c.userid=a.userid 
left join  cte d on a.id =d.moneyid  
left  join  RecordMoney_tax e on a.userid=e.userid  
where a.months='{0}'
order by a.months 

--列名不固定,只能动态

declare @item_list nvarchar(max)

select @item_list=ISNULL(@item_list+',','')+'sum(case when itemname='''+itemname+''' then moneys else 0 end) as '''+itemname+''''
from (select distinct itemname from #RecordsMoneys_Add) as A

exec('select moneyid,'+@item_list+' into #A from #RecordsMoneys_Add group by moneyid

     SELECT a.months, b.dept_code ,b.dept_name ,
            c.user_code , isnull(c.user_name,username) as user_name,a.moneys,e.tax,
            a.userid,a.deptid,a.id,a.RecordUser,a.RecordTime,a.iscw,a.isExtra
     FROM Records_Moneys  a 
     inner join public_dept_list b on a.deptid=b.deptid
     left outer join public_user_list c on c.userid=a.userid 
     left join  #A d on a.id =d.moneyid  
     left  join  RecordMoney_tax e on a.userid=e.userid  
     where a.months=''{0}''
     order by a.months ')







cattpon 2018-03-23
  • 打赏
  • 举报
回复
动态行转列就可以了~
xuzuning 2018-03-23
  • 打赏
  • 举报
回复
搜索 交叉表 SQL 实现的话要用存储过程(有通用的代码) 用代码的话,比较繁琐,但容易理解
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[RecordsMoneys_Add](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[MoneyId] [int] NOT NULL,
	[itemName] [varchar](50) NOT NULL,
	[Moneys] [decimal](18, 2) NOT NULL,
 CONSTRAINT [PK_RecordsMoneys_Add_1] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
我就是想要添加所有行,需要都select吗?
二月十六 2018-03-23
  • 打赏
  • 举报
回复
建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 16 楼 sinat_28984567 的回复:
[quote=引用 15 楼 qq_32320747 的回复:] [quote=引用 14 楼 sinat_28984567 的回复:] [quote=引用 13 楼 qq_32320747 的回复:] 就是有这么多数据,要怎么动态添加有办法吗?
那个语句就是动态添加的,不太明白楼主的需要[/quote]就是不要自己写直接从表中调用数据可以吗?[/quote] 现在就是从表里获取的,动态添加的。 [/quote]那现在的数据的添加不是要select这样子添加吗?怎么添加所有的数值?
二月十六 2018-03-23
  • 打赏
  • 举报
回复
引用 15 楼 qq_32320747 的回复:
[quote=引用 14 楼 sinat_28984567 的回复:] [quote=引用 13 楼 qq_32320747 的回复:] 就是有这么多数据,要怎么动态添加有办法吗?
那个语句就是动态添加的,不太明白楼主的需要[/quote]就是不要自己写直接从表中调用数据可以吗?[/quote] 现在就是从表里获取的,动态添加的。
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 14 楼 sinat_28984567 的回复:
[quote=引用 13 楼 qq_32320747 的回复:] 就是有这么多数据,要怎么动态添加有办法吗?
那个语句就是动态添加的,不太明白楼主的需要[/quote]就是不要自己写直接从表中调用数据可以吗?
二月十六 2018-03-23
  • 打赏
  • 举报
回复
引用 13 楼 qq_32320747 的回复:
就是有这么多数据,要怎么动态添加有办法吗?
那个语句就是动态添加的,不太明白楼主的需要
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
就是有这么多数据,要怎么动态添加有办法吗?
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 11 楼 sinat_28984567 的回复:
[quote=引用 10 楼 qq_32320747 的回复:]
[quote=引用 9 楼 sinat_28984567 的回复:]
试试这样
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([Name] nvarchar(26),[Moneys] DECIMAL(18,2))
Insert #T
select N'奖金',243 union all
select N'奖金',4514 union all
select N'药比超标罚款',-111
Go
--测试数据结束
declare @sql varchar(8000)
set @sql='select rn'
select @sql=@sql+' , SUM(case Name when '''+ Name +''' then [Moneys] else 0 end) ['+ Name +']'
from (select distinct Name from #T) as a
set @sql=@sql+' from (Select *,ROW_NUMBER()OVER(PARTITION BY Name ORDER BY GETDATE()) AS rn from #T)t group by rn'
EXEC(@sql)





是可以用的,感谢。怎么选择RecordsMoneys_Add中所有的值?是select*吗?还是要所有敲进去?[/quote]
想要什么样的结果?其他值怎么横竖显示?[/quote]就是只有这5行是横着的,其他都是一样的。怎么让数据库中的一百多行横着。
   
SELECT a.months, b.dept_code ,b.dept_name ,
c.user_code , isnull(c.user_name,username) as user_name,a.moneys,e.tax
,a.userid,a.deptid,a.id,a.RecordUser,a.RecordTime,a.iscw,a.isExtra
FROM Records_Moneys a
inner join public_dept_list b on a.deptid=b.deptid
left outer join public_user_list c on c.userid=a.userid
left join RecordsMoneys_Add d on a.id =d.MoneyId
left join RecordMoney_tax e on a.userid=e.userid
where a.months='{0}'
order by a.months
然后整个拼接起来,哈哈
二月十六 2018-03-23
  • 打赏
  • 举报
回复
引用 10 楼 qq_32320747 的回复:
[quote=引用 9 楼 sinat_28984567 的回复:] 试试这样
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Name] nvarchar(26),[Moneys] DECIMAL(18,2))
Insert #T
select N'奖金',243 union all
select N'奖金',4514 union all
select N'药比超标罚款',-111
Go
--测试数据结束
declare @sql varchar(8000)
set @sql='select rn'
select @sql=@sql+' , SUM(case Name when '''+ Name +''' then [Moneys] else 0 end) ['+ Name +']'
from (select distinct Name from #T) as a
set @sql=@sql+' from (Select *,ROW_NUMBER()OVER(PARTITION BY Name ORDER BY GETDATE()) AS rn from #T)t group by rn'
EXEC(@sql) 


是可以用的,感谢。怎么选择RecordsMoneys_Add中所有的值?是select*吗?还是要所有敲进去?[/quote] 想要什么样的结果?其他值怎么横竖显示?
二月十六 2018-03-23
  • 打赏
  • 举报
回复
试试这样
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([Name] nvarchar(26),[Moneys] DECIMAL(18,2))
Insert #T
select N'奖金',243 union all
select N'奖金',4514 union all
select N'药比超标罚款',-111
Go
--测试数据结束
declare @sql varchar(8000)
set @sql='select rn'
select @sql=@sql+' , SUM(case Name when '''+ Name +''' then [Moneys] else 0 end) ['+ Name +']'
from (select distinct Name from #T) as a
set @sql=@sql+' from (Select *,ROW_NUMBER()OVER(PARTITION BY Name ORDER BY GETDATE()) AS rn from #T)t group by rn'
EXEC(@sql)




qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 9 楼 sinat_28984567 的回复:
试试这样
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Name] nvarchar(26),[Moneys] DECIMAL(18,2))
Insert #T
select N'奖金',243 union all
select N'奖金',4514 union all
select N'药比超标罚款',-111
Go
--测试数据结束
declare @sql varchar(8000)
set @sql='select rn'
select @sql=@sql+' , SUM(case Name when '''+ Name +''' then [Moneys] else 0 end) ['+ Name +']'
from (select distinct Name from #T) as a
set @sql=@sql+' from (Select *,ROW_NUMBER()OVER(PARTITION BY Name ORDER BY GETDATE()) AS rn from #T)t group by rn'
EXEC(@sql) 


是可以用的,感谢。怎么选择RecordsMoneys_Add中所有的值?是select*吗?还是要所有敲进去?
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 4 楼 xomix 的回复:
[quote=引用 3 楼 qq_32320747 的回复:] 恩恩额,这样子有办法吗?
sql区去搜索行转列[/quote] 恩恩,我看看
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
一列,一共5列不一样的
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 3 楼 qq_32320747 的回复:] 恩恩额,这样子有办法吗?
应发奖金是出现一列还是出现两列?[/quote]应发奖金是出现一列,就像我的图2一样,就是里面有数值
qq_32320747 2018-03-23
  • 打赏
  • 举报
回复
恩恩额,这样子有办法吗?
二月十六 2018-03-23
  • 打赏
  • 举报
回复
引用 3 楼 qq_32320747 的回复:
恩恩额,这样子有办法吗?
应发奖金是出现一列还是出现两列?
  • 打赏
  • 举报
回复
引用 3 楼 qq_32320747 的回复:
恩恩额,这样子有办法吗?
sql区去搜索行转列
加载更多回复(4)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧