场等于1显示

时间:2018-02-23 14:14:44

标签: sql-server

我正在使用SQL Server 2008,如果存在重复的orderno且activityCode等于0,我希望仅在等于1时获取orderno的activityCode。 此外,如果orderno activityCode的记录等于0,那么也会显示这些记录。但是我只想在activityCode等于0时显示orderno,如果相同的orderno activityCode不等于1或者activityCode只等于0.我希望这是明确的并且有意义但是如果我需要提供更多细节请告诉我。感谢

- 创建表

create table po_v  
(   
  orderno int,   
  amount number,   
  activityCode number    
)

- 插入值

insert into po_v values     
(170268, 2774.31, 0),    
(17001988, 288.82, 0),    
(17001988, 433.23, 1),    
(170271, 3786, 1),    
(170271, 8476, 0),    
(170055, 34567, 0)

- 结果

170268    | 2774.31 | 0    
17001988  | 433.23  | 1    
170271    | 3786    | 1     
170055    | 34567   | 0

*****更新***** 我已插入两条新记录,结果已更新。实际表中的数据除了0和1之外还有其他数字.select语句显示正确的orderno但我希望orderno的其他记录也显示。该分区仅为每个orderno填充一条记录。如果可能的话,我希望看到具有相同activityCode的记录。

- 插入值

insert into po_v values      
(170271, 3799, 1),    
(172525, 44445, 2)

    --select statement
    SELECT Orderno, 
    Amount, 
    Activitycode 
    FROM   (SELECT orderno, 
           amount, 
           activitycode, 
           ROW_NUMBER() 
             OVER( 
               PARTITION BY orderno 
               ORDER BY  activitycode DESC) AS dup 
    FROM   Po_v)dt 
    WHERE  dt.dup = 1 
    ORDER  BY 1 

- 选择陈述结果

170055    | 34567   | 0
170268    | 2774.31 | 0    
170271    | 3786    | 1 
172525    | 44445   | 2
17001988  | 433.23  | 1    

- 预期结果

170055    | 34567   | 0
170268    | 2774.31 | 0    
170271    | 3786    | 1 
170271    | 3799    | 1 
172525    | 44445   | 2
17001988  | 433.23  | 1   

2 个答案:

答案 0 :(得分:1)

不完全清楚你在这里尝试做什么,但这会返回你期望的输出。

select orderno
    , amount
    , activityCode
from
(
    select *
        , RowNum = ROW_NUMBER() over(partition by orderno order by activityCode desc)
    from po_v
) x
where x.RowNum = 1

<强> --- --- EDIT

有了新的细节,这是一个非常不同的问题。据我所知,你现在希望它的所有行共享每个orderno的最大活动代码。你可以用cte轻松地做到这一点。

with MyGroups as
(
    select orderno
        , Activitycode = max(activitycode)
    from po_v
    group by orderno
)
select *
from po_v p
join MyGroups g on g.orderno = p.orderno 
    and g.Activitycode = p.Activitycode

答案 1 :(得分:0)

试试这个

SELECT Orderno, 
       Amount, 
       Activitycode 
FROM   (SELECT orderno, 
               amount, 
               activitycode, 
               ROW_NUMBER() 
                 OVER( 
                   PARTITION BY orderno 
                   ORDER BY  activitycode DESC) AS dup 
        FROM   Po_v)dt 
WHERE  dt.dup = 1 
ORDER  BY 1 

结果

Orderno     Amount      Activitycode
------------------------------------
170055      34567.00       0
170268      2774.31        0
170271      3786.00        1
17001988    433.23         1