关于sqlserver 的一个查询, 解决再加50分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlserver 的一个查询, 解决再加50分相关的知识,希望对你有一定的参考价值。
在sqlserver中查询
实际的表结构如图1,想查询后获得类似图2表结构的dataset
前提是知道name1,name2,name3,name4,但是每个项里面不一定全有,没有的话使用null表示。另外一个问题(不是重点),存储过程接受的参数是以逗号隔开的字符串,能利用逗号分割成数组吗?
if object_id('dbo.Proc_AP_BY_HPN') is not null
drop procedure dbo.Proc_AP_BY_HPN
go
create procedure Proc_AP_BY_HPN
@HPN varchar(18) = null
as
create table #temp_list
(
vendor_id varchar(50) not null,
HPN varchar(50) not null,
Currency CHAR(3) null,
Payment varchar(120) null,
Rec_Qty numeric(18,2) not null default 0.00,
Unit_Price float not null default 0.00,
GR_Dt varchar(50) not null
)
insert into #temp_list
(
vendor_id,HPN,Rec_Qty,Unit_Price,GR_Dt)
select a.vendorid,b.itemNo,0.000,Rec_qty, convert(char(4),datepart(yy,Rec_date))+'/'+convert(char(2),datepart(mm,Rec_date))
from base_Recdepot a,base_RecDepotc b
where a.add_id = b.single_id and Itemno like '%'+@hpn
select hpn,max(unitprice) as Unit_Price into #price_List
from ord_item where hpn like '%CK002'
group by hpn
update #temp_list
set unit_price = a.Rec_qty*b.unit_price
from #temp_list a,#price_list b where a.hpn = b.hpn
select a.vendor_id as [Vendor ID],B.description as [Vendor Name],a.Currency,a.Payment, convert(numeric(18,5),sum(a.unit_price)) as Amount,GR_dt
into #temp_final_list
from #temp_list a,ven_cust_mst b where a.vendor_id = b.id
group by a.vendor_id,b.description,a.Currency,a.Payment,GR_dt
--select * from #temp_final_list
declare @sql varchar(8000)
set @sql = 'select [Vendor ID],[Vendor Name],Currency,Payment,'
select @sql = @sql + 'sum(case GR_dt when '''+GR_dt+'''
then Amount else 0 end) as '''+GR_dt+''','
from (select distinct GR_dt from #temp_final_list ) as a
select @sql = left(@sql,len(@sql)-1) + '
from #temp_final_list
group by
[Vendor id],
[Vendor Name],
Currency,Payment
order by [Vendor ID]'
exec(@sql)
drop table #temp_final_list
drop table #price_list
drop table #temp_list
go
Proc_AP_BY_HPN 'CK002'
楼主,我的是全动态的,列是不确定的,也可以用变量的。用SQL CASE 直接写成是只适用于固定列的情形。 参考技术B 语句这样写就可以了。
select sitename,
max(case when sname = 'name1' then value else null) name1,
max(case when sname = 'name2' then value else null) name2,
max(case when sname = 'name3' then value else null) name3,
max(case when sname = 'name4' then value else null) name4
from 表1
group by sitename
关于“以逗号隔开的字符串”的问题,是可以实现的,需要自己写函数或者存储过程。
这个在百度上应该可以找到相似功能的代码。改改就可以了。
记得采纳啊。 参考技术C 用SQL语句如何将上面的表变成下面横向的排列方式呢。自己体会一下有一个表: tblA
SN G NUM
----------------------
001 A 100
001 B 150
001 C 110
002 A 99
002 B 180
002 C 150
003 A 160
003 B 170
003 C 130
SN A B C
-------------------
001 100 150 110
002 99 180 150
003 160 170 130
Selct sn,sum(case G when ‘A’ then NUM else null end) as SA, sum(case G when ‘B’ then NUM else 0 end) as SB,
sum(case G when ‘C’ then NUM else 0 end) as SC from tblA group by SN
(G 里面的字段是动态的,不是只有A,B,C 可能还有A,B,C,D,E...)
-------------------------------------------------------------
declare @sql varchar(6000)
set @sql = 'select '
select @sql = @sql +' sum(case G when '''+ G +''' then NUM else null end) ['+ G +'],' from (select distinct G as G from tblA) tmp set @sql = substring(@sql, 1, len(@sql)-1) +' from tblA group by SN'
exec(@sql) 参考技术D select sitename ,max(name1) as name1,max(name2) as name2,max(name3) as name3,max(name4) as name4 from
(select sitename ,
name1= case when sname=1 then value else Null end,
name2= case when sname=2 then value else Null end,
name3= case when sname=3 then value else Null end,
name4= case when sname=4 then value else Null end
from a ) a group by sitename
试试行不?
第二个问题不会,呵呵。
以上是关于关于sqlserver 的一个查询, 解决再加50分的主要内容,如果未能解决你的问题,请参考以下文章