SQl语句求写(100分)

  • 主题发起人 主题发起人 ybb507
  • 开始时间 开始时间
Y

ybb507

Unregistered / Unconfirmed
GUEST, unregistred user!
Sql server数据库
表结构:
bm km zgxe
部门一 出差费 200.00
部门一 补助 300.00
部门二 出差费 100.00
部门二 补助 200.00
想要得到的结果:
部门 出差费 补助 ... 总数
部门一 200.00 300.00 500.00
部门二 100.00 200.00 300.00

其中部门个数和km的个数都是不定的. 高手来帮忙
 
交叉表查询,查询一下以前的帖子。
一般来说一条sql无法作到.
 
属于统计的SQL语句。做活的还是写死?
 
今天交接结束,得益于大富翁很多很多,平时没时间过来,今天来给大家解决问题,涉及SQL SERVER DELPHI7/2006 CXGRID/DXGRID Reportbuild
 
--今天交接结束,得益于大富翁很多很多,平时没时间过来,今天来给大家解决问题,涉及SQL SERVER DELPHI7/2006 CXGRID/DXGRID Reportbuild
--以下是写死与不写死的两种方法,如有问题请联系grj163my@163.net
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Proc_DecussateTable]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Proc_DecussateTable]
go
CREATE PROCEDURE [dbo].[Proc_DecussateTable]
(
@TableName varchar(100),
@RowFieldName varchar(100),
@ColFieldName varchar(100),
@ValueFieldName varchar(100)
)
AS
set nocount on
declare @sql Nvarchar(4000)
declare @Returnsql Nvarchar(4000)
set @sql = ' set @Returnsql ='' select '+@RowFieldName+','' '+
' select @Returnsql = @Returnsql+'' sum(case '+@ColFieldName+' when'''''' +'+@ColFieldName+'+ '''''' then '+@ValueFieldName+' else 0 end) as ''''''+ '+@ColFieldName+'+'''''','''+
' from (select distinct '+@ColFieldName+' from '+@TableName+') as a '

--得到结果的表语句(核心部分)
exec sp_executesql @Sql,N'@Returnsql Nvarchar(4000) output',@Returnsql output
set @sql = left(@Returnsql,len(@Returnsql)-1) +
',(select sum('+@ValueFieldName+') from '+@TableName+' a where a.'+@RowFieldName+'=b.'+@RowFieldName+') as 总计 '+
' from '+@TableName+' b group by '+@RowFieldName+''

--执行语句
exec sp_executesql @Sql



go
CREATE TABLE [Test] (
[bm] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[km] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[zgxe] [numeric](18, 0) NULL
) ON [PRIMARY]
GO
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门一',N'出差费',200)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门一',N'补助',300)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门二',N'出差费',100)
INSERT INTO [test] ([bm],[km],[zgxe]) values (N'部门二',N'补助',200)

exec Proc_DecussateTable 'test','bm','km','zgxe'

--请在查询分析器中运行上面的语句,这是动态的方法,静态的如下
select bm, sum(case km when'补助' then zgxe else 0 end) as '补助',
sum(case km when'出差费' then zgxe else 0 end) as '出差费',
(select sum(zgxe) from test a where a.bm=b.bm) as 总计
from test b group by bm

drop table test
 
这么麻烦,建一个临时表,怎么弄就行,为什么非要一两条SQL就搞定呢?
 
如果您要动态支持,除了表函数就是过程,
建一个临时表的思想也是一样的,也是要将结果先导到临时表中,可这放的过程中也是要动态生成最终的SQL语句的,是吗,朋友
 
select bm, sum(case km when'补助' then zgxe else 0 end) as '补助',
sum(case km when'出差费' then zgxe else 0 end) as '出差费',
(select sum(zgxe) from test a where a.bm=b.bm) as 总计
from test b group by bm
 
同意SWTHJ
平时都这么用,特别是做横纵行转置时最好用了
 
同意楼上,正确,方便
 
case 。。。 when 。。。then 最好用啊
 
create procedure SelKM
as
declare @sqlText nvarchar(2000)

select @sqlText='select BM,'

select @sqlText=@sqltext+'sum((CASE KM WHEN '''+KM+''' THEN ZGXE ELSE 0 END)) AS ''' +Km+
''',' from (select distinct KM from KMXE) as a

select @sqlText=left(@sqlText,Len(@sqlText)-1)+' from KMXE group by BM '
exec (@sqlText)
go
要动态的 ,呵呵,周一来分分
 
我以前也不大懂,不过昨天看书知道这叫数据透视或者交叉表
里面推荐使用CASE语句的。。。
 
sql server 2005特地为交叉表查询定义了一个新的语法:
http://dev.yesky.com/394/2429894.shtml
 
樓主為何不給分呢
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
859
SUNSTONE的Delphi笔记
S
S
回复
0
查看
785
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部