有表A如下:
列名: 日期 编号 单据号 金额
2009-10-1 00001 yw00004 100
2009-10-8 00001 yw00010 800
转换为表B——
列名:编号 金额 单据号
00001 900 yw00004 yw00010 其中表A为明细;经过转换为表B以后,按编号汇总,去掉日期,同时将单据号转在一行中显示;
这样的sql怎么写?
列名: 日期 编号 单据号 金额
2009-10-1 00001 yw00004 100
2009-10-8 00001 yw00010 800
转换为表B——
列名:编号 金额 单据号
00001 900 yw00004 yw00010 其中表A为明细;经过转换为表B以后,按编号汇总,去掉日期,同时将单据号转在一行中显示;
这样的sql怎么写?
解决方案 »
- 这段触发器哪儿不对呀?
- ODBC中命名管道不通,但TCP/IP可以连通
- SQL 2008数据库附加失败!!请指定一二来!小菜在此多谢了!
- 求助!!!!!!!!!!急!!!!!!!
- restore log报错:日志位于与数据库不一致的恢复路径上 , 另外产生checkpoint 时写数据吗?写到tempdb or 真正的目标库 or 日志文件 ?
- 一个大型数据库分散成几个小型的库 数据库分流
- 弱弱地问:CRM ERP和MIS有什么区别?
- 这update是怎么回事??
- SQL 如何将 两个table 的 字段怎么 合并到一张表
- oralce数据库,一些数据的展现问题。
- SQL2005表的问题
- 数据库在网站中的位置
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-10-14 18:41:28
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([日期] datetime,[编号] varchar(5),[单据号] varchar(7),[金额] int)
insert [tb]
select '2009-10-1','00001','yw00004',100 union all
select '2009-10-8','00001','yw00010',800
--------------开始查询--------------------------
select 编号,sum(金额) as 金额, [单据号]=stuff((select ''+[单据号] from tb t where [编号]=tb.[编号] for xml path('')), 1, 0, '')
from tb
group by 编号
----------------结果----------------------------
/* 编号 金额 单据号
----- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
00001 900 yw00004yw00010(1 行受影响)
*/
drop function f_tmp
go
create function f_tmp(@value varchar(10))
returns varchar(100)
as
begin
declare @s varchar(1000)
set @s = ''
select @s = @s+name from t where ck = @value
return @s
end
goif object_id('t') is not null
drop table tcreate table t (ck varchar(10),name varchar(10),num int)
insert into t
select 'B01', 'A',100
union all select 'B02', 'B',50
union all select 'B01', 'C',30
union all select 'B03', 'D',20
union all select 'B02', 'A',50
union all select 'B04', 'B',100
union all select 'B03', 'C',500
--sql2000
select ck
,[name] = dbo.f_tmp(ck)
,num = sum(num)
from t a
group by ck
--sql2005
/*
select ck
,[name] = stuff((select ',' + [name] from t where ck = a.ck for xml path('')) , 1 , 1 , '')
,num = sum(num)
from t a
group by ck
*/
drop table t
drop function f_tmpck name num
---------- ---------------------------------------------------------------------------------------------------- -----------
B01 AC 130
B02 BA 100
B03 DC 520
B04 B 100(所影响的行数为 4 行)
给楼主参考,蹭个分
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([日期] datetime,[编号] varchar(5),[单据号] varchar(7),[金额] int)
insert [tb]
select '2009-10-1','00001','yw00004',100 union all
select '2009-10-8','00001','yw00010',800declare @s varchar(40)select @s=isnull(@s,'')+' ' +[单据号] from tb
select [编号],[金额]=sum([金额]),[单据号]=max(@s) from tb group by [编号]
编号 金额 单据号
----- ----------- ----------------------------------------
00001 900 yw00004 yw00010(1 行受影响)
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-10-14 18:41:28
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([日期] datetime,[编号] varchar(5),[单据号] varchar(7),[金额] int)
insert [tb]
select '2009-10-1','00001','yw00004',100 union all
select '2009-10-8','00001','yw00010',800
--------------开始查询--------------------------
CREATE FUNCTION dbo.f_strUnite(@id varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ' ' + 单据号 FROM tb WHERE 编号=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECT 编号,sum(金额) as 金额, 单据号 = dbo.f_strUnite(编号) FROM tb GROUP BY 编号
drop table tb
drop function dbo.f_strUnite
go
----------------结果----------------------------
/* 编号 金额 单据号
----- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
00001 900 yw00004yw00010(1 行受影响)
*/
(华夏小卒)
你是我的偶像!!!