34,590
社区成员
发帖
与我相关
我的任务
分享
表A,两个字段: CreateDate, Detail
---------------------------------------
CreateDate Detail
2009-11-26 00:00:00.000 (A3-5)
2009-11-26 00:00:00.000 (B3-2)
2009-11-27 00:00:00.000 (A3-3)
2009-11-27 00:00:00.000 (B3-1)
---------------变成---------------------
2009-11-26 00:00:00.000 (A3-5)#(B3-2)
2009-11-27 00:00:00.000 (A3-3)#(B3-1)
------------求救?---------------------
DECLARE @T TABLE (
[NAME] VARCHAR(50)
,[TYPE] VARCHAR(50)
,PRICE NUMERIC(19,2)
)
INSERT INTO @T
SELECT '诺基亚','N80', 1203 UNION ALL
SELECT '诺基亚','E90', 675 UNION ALL
SELECT '诺基亚','E61', 155 UNION ALL
SELECT '诺基亚','N73', 30 UNION ALL
SELECT '诺基亚','N7610', 10 UNION ALL
SELECT '索爱','K506', 8918 UNION ALL
SELECT '索爱','S700', 6489 UNION ALL
SELECT '索爱','W880', 1310 UNION ALL
SELECT '索爱','T238', 713 UNION ALL
SELECT '索爱','Z1010', 650 UNION ALL
SELECT '索爱','Z208', 394 UNION ALL
SELECT '索爱','P908', 146 UNION ALL
SELECT '索爱','V800', 58 UNION ALL
SELECT '索爱','K700c', 19 UNION ALL
SELECT '索爱','K300', 11 UNION ALL
SELECT '索爱','T68', 11 UNION ALL
SELECT '索爱','T628', 7
SELECT * FROM (
SELECT * FROM @T
UNION ALL
SELECT
CASE WHEN GROUPING([NAME])=1 THEN '总计' ELSE [NAME] END
,CASE WHEN GROUPING([TYPE])=1 THEN CASE WHEN GROUPING([NAME])=1 THEN '' ELSE '小计' END ELSE [TYPE] END
,SUM(PRICE) FROM @T
GROUP BY [NAME],[TYPE] WITH ROLLUP) T
ORDER BY [NAME]
/*
诺基亚 N80 1203.00
诺基亚 E90 675.00
诺基亚 E61 155.00
诺基亚 N73 30.00
诺基亚 N7610 10.00
诺基亚 E61 155.00
诺基亚 E90 675.00
诺基亚 N73 30.00
诺基亚 N7610 10.00
诺基亚 N80 1203.00
诺基亚 小计 2073.00
索爱 K300 11.00
索爱 K506 8918.00
索爱 K700c 19.00
索爱 P908 146.00
索爱 S700 6489.00
索爱 T238 713.00
索爱 T628 7.00
索爱 T68 11.00
索爱 V800 58.00
索爱 W880 1310.00
索爱 Z1010 650.00
索爱 Z208 394.00
索爱 小计 18726.00
索爱 K506 8918.00
索爱 S700 6489.00
索爱 W880 1310.00
索爱 T238 713.00
索爱 Z1010 650.00
索爱 Z208 394.00
索爱 P908 146.00
索爱 V800 58.00
索爱 K700c 19.00
索爱 K300 11.00
索爱 T68 11.00
索爱 T628 7.00
总计 20799.00
*/
---我现在的查询出来的结果如下:
诺基亚 N80 1203
诺基亚 E90 675
诺基亚 E61 155
诺基亚 N73 30
诺基亚 N7610 10
索爱 K506 8918
索爱 S700 6489
索爱 W880 1310
索爱 T238 713
索爱 Z1010 650
索爱 Z208 394
索爱 P908 146
索爱 V800 58
索爱 K700c 19
索爱 K300 11
索爱 T68 11
索爱 T628 7
---------
--我现在想每类加个 小计: .. ..
--最后加个总计: .. ..
----------------------------------
诺基亚 N80 1203
诺基亚 E90 675
诺基亚 E61 155
诺基亚 N73 30
诺基亚 N7610 10
小计 .. 2073
索爱 K506 8918
索爱 S700 6489
索爱 W880 1310
索爱 T238 713
索爱 Z1010 650
索爱 Z208 394
索爱 P908 146
索爱 V800 58
索爱 K700c 19
索爱 K300 11
索爱 T68 11
索爱 T628 7
小计 .. 18726
总计 .. 20799
---------怎么实现啊?
---我现在的查询出来的结果如下:
诺基亚 N80 1203
诺基亚 E90 675
诺基亚 E61 155
诺基亚 N73 30
诺基亚 N7610 10
索爱 K506 8918
索爱 S700 6489
索爱 W880 1310
索爱 T238 713
索爱 Z1010 650
索爱 Z208 394
索爱 P908 146
索爱 V800 58
索爱 K700c 19
索爱 K300 11
索爱 T68 11
索爱 T628 7
---------
--我现在想每类加个 小计: .. ..
--最后加个总计: .. ..
----------------------------------
诺基亚 N80 1203
诺基亚 E90 675
诺基亚 E61 155
诺基亚 N73 30
诺基亚 N7610 10
小计 .. 2073
索爱 K506 8918
索爱 S700 6489
索爱 W880 1310
索爱 T238 713
索爱 Z1010 650
索爱 Z208 394
索爱 P908 146
索爱 V800 58
索爱 K700c 19
索爱 K300 11
索爱 T68 11
索爱 T628 7
小计 .. 18726
总计 .. 20799
---------怎么实现啊?
create table a
(
CreateDate datetime,
Detail varchar(64)
)
go
insert into a
select '2009-11-26 00:00:00.000', '(A3-5)' union all
select '2009-11-26 00:00:00.000', '(B3-2)' union all
select '2009-11-27 00:00:00.000', '(A3-3)' union all
select '2009-11-27 00:00:00.000', '(B3-1)'
go
create FUNCTION dbo.f_str(@time datetime)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + '#' + Detail
FROM a
WHERE CreateDate=@time
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt CreateDate, [values]=dbo.f_str(CreateDate)
FROM a
GROUP BY CreateDate
--如果每组2条
/*
*************************************
* T-MAC 小编 *
* -->努力成长中 *
* -->梦想DBA *
*************************************
*/
if OBJECT_ID('tb') is not null
drop table tb
go
create table tb (CreateDate datetime , Detail varchar(10))
insert tb select
'2009-11-26 00:00:00.000' , '(A3-5)' union select
'2009-11-26 00:00:00.000' , '(B3-2)' union select
'2009-11-27 00:00:00.000' , '(A3-3)' union select
'2009-11-27 00:00:00.000' , '(B3-1)'
go
select CreateDate=CONVERT(varchar(10),CreateDate,120)
,Detail=MIN(detail)+'#'+Max(detail)
from tb
group by CreateDate
CreateDate Detail
---------- ---------------------
2009-11-26 (A3-5)#(B3-2)
2009-11-27 (A3-3)#(B3-1)
select
CreateDate,
Detail=stuff((select '#'+detail from a where createdate=t.createdate for xml path('')),1,1,'')
from
a t
group by
createdate
SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)
1. 旧的解决方法
-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id
-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/