日期:2014-05-18 浏览次数:20461 次
例子吗? --> 生成测试数据表:a IF NOT OBJECT_ID('[a]') IS NULL DROP TABLE [a] GO CREATE TABLE [a]([id] INT,[name] NVARCHAR(10),[parentid] INT) INSERT [a] SELECT 1,'area',0 UNION ALL SELECT 2,'category',0 UNION ALL SELECT 3,'north',1 UNION ALL SELECT 4,'south',1 UNION ALL SELECT 5,'Shanghai',4 UNION ALL SELECT 6,'Beijing',3 UNION ALL SELECT 7,'pudong',5 UNION ALL SELECT 8,'xuhui',5 UNION ALL SELECT 9,'chaoyang',6 UNION ALL SELECT 10,'desk',2 UNION ALL SELECT 11,'chair',2 UNION ALL SELECT 12,'bed',2 GO --> 生成测试数据表:b IF NOT OBJECT_ID('[b]') IS NULL DROP TABLE [b] GO CREATE TABLE [b]([id] INT,[area] INT,[city] INT,[district] NVARCHAR(10)) INSERT [b] SELECT 1,4,5,'pudong' UNION ALL SELECT 2,4,5,'xuhui' UNION ALL SELECT 3,4,6,'chaoyang' GO --> 生成测试数据表:c IF NOT OBJECT_ID('[c]') IS NULL DROP TABLE [c] GO CREATE TABLE [c]([id] INT,[category] INT,[area] INT,[city] INT,[district] INT) INSERT [c] SELECT 1,10,4,5,7 UNION ALL SELECT 2,10,4,5,7 UNION ALL SELECT 3,11,4,5,8 UNION ALL SELECT 4,11,3,6,9 UNION ALL SELECT 5,10,3,6,9 GO -->SQL查询如下: --SELECT * FROM [a] --SELECT * FROM [b] --SELECT * FROM [c] -->SQL查询如下: select a0.name area, a1.name city, a2.name district, '' address, MAX(case a3.name when 'desk' then 数量 else 0 end) 桌子数量, MAX(case a3.name when 'chair' then 数量 else 0 end) 椅子数量, MAX(case a3.name when 'bed' then 数量 else 0 end) 床数量 from ( select category,area,city,[district],COUNT(1) 数量 from c group by category,area,city,[district] ) c join a a0 on a0.id=c.area join a a1 on a1.id=c.[city] join a a2 on a2.id=c.district join a a3 on a3.id=c.category left join b on b.area=c.area and c.city=b.city group by a0.name,a1.name,a2.name /* area city district address 桌子数量 椅子数量 床数量 ---------- ---------- ---------- ------- ----------- ----------- ----------- north Beijing chaoyang 1 1 0 south Shanghai pudong 2 0 0 south Shanghai xuhui 0 1 0 (3 行受影响) */
------解决方案--------------------
--处理表重复记录(查询和删除) /****************************************************************************************************************************************************** 1、Num、Name相同的重复值记录,没有大小关系只保留一条 2、Name相同,ID有大小关系时,保留大或小其中一个记录 整理人:中国风(Roy) 日期:2008.06.06 ******************************************************************************************************************************************************/ --1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理) --> --> (Roy)生成測試數據 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2)) Insert #T select 1,N'A',N'A1' union all select 2,N'A',N'A2' union all select 3,N'A',N'A3' union all select 4,N'B',N'B1' union all select 5,N'B',N'B2' Go --I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2 方法1: Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID) 方法2: select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID 方法3: select * from #T a where ID=(select min(ID) from #T where Name=a.Name) 方法4: select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1 方法5: select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name) 方法6: select * from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)=0 方法7: select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID) 方法8: select * from #T a where ID!>all(select ID from #T where Name=a.Name) 方法9(注:ID为唯一时可用): select *