简体   繁体   English

ROW_NUMBER和PARTITION

[英]ROW_NUMBER & PARTITION

I am trying to use ROW_NUMBER OVER PARTITION to blank out certain values unless someone can suggest a better way, my data looks something like this 我正在尝试使用ROW_NUMBER OVER PARTITION来清除某些值,除非有人可以提出更好的方法,否则我的数据看起来像这样

create table Emp_Details
(  Emp_Name varchar(10)
, Company varchar(15)
,Qty int
,LineOrderCost money
,OrderUnitCost money
,ExtraCost money
,ExtraDesc varchar(5)
) 

insert into Emp_Details (Emp_Name, Company, Qty, LineOrderCost, OrderUnitCost, ExtraCost, ExtraDesc)
values 
('John', 'PStock', 1, '2.50','3.50', '7.50', 'ABC')
,('John', 'PStock', 1, '2.50','3.50', '7.50', 'DEF')

What I want to do is return both records but set the LineOrderCost , OrderUnitCost , ExtraCost to 0 on the second line or if there are more than just 2 lines all following lines after the first one, hence when Emp_Name , Company and Qty are the same but the ExtraDesc is different blank out those values as described. 我想做的是返回两条记录,但在第二行LineOrderCostOrderUnitCostExtraCost为0,或者如果在第一行之后的所有后续行中只有2行以上,那么当Emp_NameCompanyQty相同时但是ExtraDesc是不同的,如所描述的那样将那些值排除在外。

I apologies if I have not described this to well but in my head it makes some sort of sense :-) 如果我没有很好地描述这一点,我深表歉意,但是在我看来,这是有道理的:-)

Thanks P 谢谢P

 Select EMP_NAME,COMPANY,QTY, EXTRADESC,
    Case when row>1 then 0 else ORDERUNITCOST end as ORDERUNITCOST,
    Case when row>1 then 0 else LINEORDERCOST end as LINEORDERCOST,
    Case when row>1 then 0 else EXTRACOST end as EXTRACOST
    from
    (Select Row_Number() Over(Partition By EMP_NAME order by EMP_NAME) as row,* from 
    Emp_Details) t

Sql Fiddle Demo SQL小提琴演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM