日期:2014-05-18 浏览次数:20748 次
SELECT a.NAME,b.Num,a.Type FROM table1 AS a CROSS APPLY (SELECT TOP 1 num FROM table1 WHERE NAME=a.Name) AS b
------解决方案--------------------
create table tb(name varchar(10),num int,type varchar(10)) insert into tb select '公司1',20,'出境' insert into tb select '公司1',12,'进境' insert into tb select '公司2',30,'出境' insert into tb select '公司2',32,'进境' insert into tb select '公司3',40,'出境' insert into tb select '公司3',45,'进境' insert into tb select '公司4',21,'出境' insert into tb select '公司4',19,'进境' go ;with cte as( select *,row_number()over(partition by name order by (select 1))rn from tb )select name,(select num from cte where name=a.name and rn=1)num,type from cte a /* name num type ---------- ----------- ---------- 公司1 20 出境 公司1 20 进境 公司2 30 出境 公司2 30 进境 公司3 40 出境 公司3 40 进境 公司4 21 出境 公司4 21 进境 (8 行受影响) */ go drop table tb
------解决方案--------------------
use Tempdb go --> --> declare @T table([name] nvarchar(3),[num] int,[type] nvarchar(2)) Insert @T select N'公司1',20,N'出境' union all select N'公司1',12,N'进境' union all select N'公司2',30,N'出境' union all select N'公司2',32,N'进境' union all select N'公司3',40,N'出境' union all select N'公司3',45,N'进境' union all select N'公司4',21,N'出境' union all select N'公司4',19,N'进境' SELECT a.NAME,b.Num,a.Type FROM @T AS a CROSS APPLY (SELECT TOP 1 num FROM @T WHERE NAME=a.Name) AS b /* NAME Num Type 公司1 20 出境 公司1 20 进境 公司2 30 出境 公司2 30 进境 公司3 40 出境 公司3 40 进境 公司4 21 出境 公司4 21 进境 */
------解决方案--------------------
--SQL2000時 use Tempdb go --> --> declare @T table([name] nvarchar(3),[num] int,[type] nvarchar(2)) Insert @T select N'公司1',20,N'出境' union all select N'公司1',12,N'进境' union all select N'公司2',30,N'出境' union all select N'公司2',32,N'进境' union all select N'公司3',40,N'出境' union all select N'公司3',45,N'进境' union all select N'公司4',21,N'出境' union all select N'公司4',19,N'进境' SELECT a.NAME,Num=(SELECT TOP 1 Num FROM @T WHERE Name=a.Name), a.Type FROM @T AS a /* NAME Num Type 公司1 20 出境 公司1 20 进境 公司2 30 出境 公司2 30 进境 公司3 40 出境 公司3 40 进境 公司4 21 出境 公司4 21 进境*/
------解决方案--------------------
or:
create table tb(name varchar(10),num int,type varchar(10)) insert into tb select '公司1',20,'出境' insert into tb select '公司1',12,'进境' insert into tb select '公司2',30,'出境' insert into tb select '公司2',32,'进境' insert into tb select '公司3',40,'出境' insert into tb select '公司3',45,'进境' insert into tb select '公司4',21,'出境' insert into tb select '公司4',19,'进境' go select name, (select num from(select *,row_number()over(partition by name order by (select 1))rn from tb)t where name=a.name and rn=1)num, type from tb a /* name num type ---------- ----------- ---------- 公司1 20 出境 公司1 20 进境 公司2 30 出境 公司2 30 进境 公司3 40 出境 公司3 40 进境 公司4 21 出境 公司4 21 进境 (8 行受影响) */ go drop table tb
------解决方案--------------------