如果值是SQL中的重复,如何使select语句返回“NULL”

时间:2015-08-06 06:34:40

标签: sql sql-server tsql sql-server-2012

让我们来:

SELECT Name, Surname, Salary, TaxPercentage
FROM Employees

返回:

 Name |Surname     |Salary  |TaxPercentage
-------------------------------------- 
Moosa | Jacobs     | $14000 | 13.5
Temba | Martins    | $15000 | 13.5
Jack  | Hendricks  | $14000 | 13.5

我希望它返回:

 Name |Surname   | Salary  |TaxPercentage
-------------------------------------------  
Moosa | Jacobs   |  $14000 | NULL
Temba | Martins  |  $15000 | NULL
Jack  | Hendricks|  $14000 | 13.5 

由于TaxPercentage的值重复出现,我希望它最后只出现一次。

5 个答案:

答案 0 :(得分:7)

在sql server 2012及更高版本中,您可以使用Lead窗口函数来获取下一行的值。假设您有某种方法对数据进行排序(如标识列),您可以利用此优势:

SELECT Name, 
       Surname, 
       Salary, 
       CASE WHEN TaxPercentage = LEAD(TaxPercentage) OVER (ORDER BY Id) THEN 
         NULL 
       ELSE 
          TaxPercentage 
       END As TaxPercentage 
FROM Employees
ORDER BY Id

请参阅fiddle(感谢Lasse V. Karlsen

答案 1 :(得分:1)

如果由于某种原因您无法使用LEAD(),那么这应该有效:

with T as (
    SELECT
        Name, Surname, Salary, TaxPercentage,
        row_number() over (order by TaxPercentage /* ??? */) as rn
    FROM Employees
)
select
    Name, Surname, Salary,
    nullif(
        TaxPercentage,
        (select t2.rn from T as t2 where t2.rn = t.rn + 1)
    ) as TaxPercentage
from T as t

答案 2 :(得分:1)

你应该有办法按顺序订购数据。在我的示例中,我使用简单的IDENTITY列,在您的列中可能是主键或日期:

DECLARE @DataSource  TABLE
(
     [Name] VARCHAR(12)
    ,[Surname] VARCHAR(12)
    ,[Salary] VARCHAR(12)
    ,[TaxPercentage] DECIMAL(9,1)
    --
    ,[RowID] TINYINT IDENTITY(1,1)
);

INSERT INTO @DataSource ([Name], [Surname], [Salary], [TaxPercentage])
VALUES ('Moosa', 'Jacobs', '$14000', '13.5')
      ,('Temba', 'Martins', '$15000', '13.5')
      ,('Jack', ' Hendricks', '$14000', '13.5')
      ,('Temba', 'Martins', '$15000', '1.5')
      ,('Jack', ' Hendricks', '$14000', '1.5')
      ,('Temba', 'Martins', '$15000', '23')
      ,('Jack', ' Hendricks', '$14000', '7')
      ,('Temba', 'Martins', '$15000', '7')
      ,('Jack', ' Hendricks', '$14000', '7')

SELECT [Name]
      ,[Surname]
      ,[Salary]
      ,[TaxPercentage]
      ,NULLIF([TaxPercentage], LEAD([TaxPercentage], 1, NULL) OVER (ORDER BY [RowID])) AS [NewTaxPercentage]
FROM @DataSource;

答案 3 :(得分:1)

我需要一个列来对像Id这样的行进行排序

;with cte as (
SELECT
    Id, Name, Surname, Salary, TaxPercentage,
    LEAD(TaxPercentage, 1, NULL) OVER (ORDER BY Id) AS NextValue
FROM Employees
)
select
    Id, Name, Surname, Salary,-- TaxPercentage,
    TaxPercentage = CASE WHEN TaxPercentage = NextValue THEN NULL ELSE TaxPercentage END
from cte

请查看SQL Lag()Lead() functions,了解有关这些新分析功能的详细信息

答案 4 :(得分:0)

如果需要,使用SQL Server> = 2008 http://sqlfiddle.com/#!3/ec020/1/0

Select o.Name, o.Surname, o.Salary
, TaxPercentage = case when o.id = 1 then o.TaxPercentage else null end
From (
    Select Name, Surname, Salary, TaxPercentage
    , id = row_number() over(partition by TaxPercentage order by Name, surname, Salary) -- update order...
    From Employees as e
) as o
order by o.TaxPercentage, o.id desc
相关问题