如A表
code shoping monney shijian
1000 苹果 11 2013-01-01
1000 梨子 12 2013-01-01
1000 西瓜 13 2013-01-02
1000 苹果 14 2013-01-01
1000 梨子 15 2013-01-01
1000 西瓜 16 2013-01-02
1001 瓜子 15 2013-01-01
1001 南瓜 16 2013-01-02
1002 萝卜 16 2013-01-02显示成:
code shoping1 monney1 shijian1 shoping2 monney2 shijian2 shoping3 monney3 shijian3 shoping4 monney4 shijian4 shoping5 monney5 shijian5
shoping6 monney6 shijian6
1000 苹果 11 2013-01-01 梨子 12 2013-01-01
西瓜 13 2013-01-02 苹果 14 2013-01-01 梨子 15 2013-01-01 西瓜 16 2013-01-021001 瓜子 15 2013-01-01 南瓜 16 2013-01-021002 萝卜 16 2013-01-02也就是一个编号只有一行数据。
解决方案 »
- exists和in的效率问题
- 该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
- 英文版服务器+Sql server 2005 中文字段乱码问题
- 安装mssql2005出错,请高手帮忙
- 求成绩分析 排名问题 谢谢
- 在线求救!数据库丢失表怎么办??散掉最后30分
- 那我现在一个10万字的字符串,如何用一个变量代替它?
- 哪里有asp调用存储过程的资料,或sql server存储过程的资料或书的下载?
- 请提供几个好的SQL Server的教学站点,只要好,一律给分!!!
- sqlserver服务器有没有超时监测的功能,或相关参数设置。。。,。。。
- 如何在调试时清除临时表
- 求一个组合查询条件的查询语句
通常情况下我们对相同项目进分组求和,那是相当的简单啦,只要select.. group by加聚合函数就行了,可是对于串一类的项目进行合并时就不这么简单了,同样分解一个按指定分隔符分隔的串或分析指定位置的串,在2000下我们通常是创建一个函数,然后分组或提取就行了,现我们主要讨论在2005下利用xml来完成这个工作。
1、先来一个简单点,如下的例子对aaa相同的项目合并。
------------------------------------------------------------------------
-- Author: HappyFlyStone
-- Date : 2009-01-04 20:57:59
-- Ver: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
--
------------------------------------------------------------------------
-- Test Data: tb
IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
Go
CREATE TABLE tb(aaa INT,bbb INT)
Go
INSERT INTO tb
SELECT 1,2 UNION ALL
SELECT 1,3 UNION ALL
SELECT 1,4 UNION ALL
SELECT 2,2 UNION ALL
SELECT 2,5
GO
--查询1
select
aaa,
[values]=stuff(replace(replace((select [bbb]
from tb
where aaa=t.aaa for xml AUTO),
'"/><tb bbb="',','),
'"/>',''),1,9,'')
from tb t
group by aaa
这个还是不能达到要求。 我想能不能这样 给每个code 下面的shoping编一个值 code shoping monney shijian 值
1000 苹果 11 2013-01-01 1
1000 梨子 12 2013-01-01 2
1000 西瓜 13 2013-01-02 3
1000 苹果 14 2013-01-01 4
1000 梨子 15 2013-01-01 5
1000 西瓜 16 2013-01-02 6
1001 瓜子 15 2013-01-01 1
1001 南瓜 16 2013-01-02 2
1002 萝卜 16 2013-01-02 1
这样会不会容易显示一点吧。 但是这个值怎么编好呢?
即可,好像得2005或2008才行
GO
/*
如A表
code shoping monney shijian
1000 苹果 11 2013-01-01
1000 梨子 12 2013-01-01
1000 西瓜 13 2013-01-02
1000 苹果 14 2013-01-01
1000 梨子 15 2013-01-01
1000 西瓜 16 2013-01-02
1001 瓜子 15 2013-01-01
1001 南瓜 16 2013-01-02
1002 萝卜 16 2013-01-02显示成:
code shoping1 monney1 shijian1 shoping2 monney2 shijian2 shoping3 monney3 shijian3 shoping4 monney4 shijian4 shoping5 monney5 shijian5
shoping6 monney6 shijian6
1000 苹果 11 2013-01-01 梨子 12 2013-01-01
西瓜 13 2013-01-02 苹果 14 2013-01-01 梨子 15 2013-01-01 西瓜 16 2013-01-021001 瓜子 15 2013-01-01 南瓜 16 2013-01-021002 萝卜 16 2013-01-02也就是一个编号只有一行数据。
*/-->生成表Aif object_id('A') is not null
drop table A
Go
Create table A([code] nvarchar(4),[shoping] nvarchar(2),[monney] nvarchar(2),[shijian] datetime)Insert into A
Select N'1000',N'苹果',N'11','2013-01-01' Union all
Select N'1000',N'梨子',N'12','2013-01-01' Union all
Select N'1000',N'西瓜',N'13','2013-01-02' Union all
Select N'1000',N'苹果',N'14','2013-01-01' Union all
Select N'1000',N'梨子',N'15','2013-01-01' Union all
Select N'1000',N'西瓜',N'16','2013-01-02' Union all
Select N'1001',N'瓜子',N'15','2013-01-01' Union all
Select N'1001',N'南瓜',N'16','2013-01-02' Union all
Select N'1002',N'萝卜',N'16','2013-01-02'
DECLARE @sql NVARCHAR(MAX)SELECT
@sql=ISNULL(@sql+',','')
+N'Max(Case when row='+row+N' then shoping End) As shoping'+row
+N',Max(Case when row='+row+N' then monney End) As monney'+row
+N',Max(Case when row='+row+N' then shijian End) As shijian'+row
FROM (
SELECT
LTRIM(ROW_NUMBER()OVER(PARTITION BY code ORDER BY monney ASC)) AS row
FROM A
) AS t
GROUP BY row
Exec (N'Select code,'+@sql+N' from (SELECT
ROW_NUMBER()OVER(PARTITION BY code ORDER BY monney ASC) AS row
,*
FROM A) As t Group by code')
/*
code shoping1 monney1 shijian1 shoping2 monney2 shijian2 shoping3 monney3 shijian3 shoping4 monney4 shijian4 shoping5 monney5 shijian5 shoping6 monney6 shijian6
---- -------- ------- ----------------------- -------- ------- ----------------------- -------- ------- ----------------------- -------- ------- ----------------------- -------- ------- ----------------------- -------- ------- -----------------------
1000 苹果 11 2013-01-01 00:00:00.000 梨子 12 2013-01-01 00:00:00.000 西瓜 13 2013-01-02 00:00:00.000 苹果 14 2013-01-01 00:00:00.000 梨子 15 2013-01-01 00:00:00.000 西瓜 16 2013-01-02 00:00:00.000
1001 瓜子 15 2013-01-01 00:00:00.000 南瓜 16 2013-01-02 00:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
1002 萝卜 16 2013-01-02 00:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
*/