关于sqlserver 的一个查询, 解决再加50分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlserver 的一个查询, 解决再加50分相关的知识,希望对你有一定的参考价值。

在sqlserver中查询
实际的表结构如图1,想查询后获得类似图2表结构的dataset
前提是知道name1,name2,name3,name4,但是每个项里面不一定全有,没有的话使用null表示。另外一个问题(不是重点),存储过程接受的参数是以逗号隔开的字符串,能利用逗号分割成数组吗?

参考技术A 这是个交叉表,很容易的。用存储过程+临时表就最简单了。找了半天,终于找到我N年前写的一个给你参考一下,至少这种是相当灵活的。记得给分,兄弟!

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分的主要内容,如果未能解决你的问题,请参考以下文章

Java实现贵宾使用时间过期 自动 冻结此用户(更改用户当前状态)解决了,再加50分

关于SQLServer 2000 索引问题

sqlserver数某一个值的数量

sqlserver字段长度50和5000的区别

sql 子查询返回的值不止一个怎么解决?

「考试」省选50