在SQL Server中处理Null值和重复记录

时间:2014-10-01 16:10:45

标签: sql sql-server reporting-services

我有一个方案,我正在SQL Server Reporting Services创建一个表格式报告并停留在我获得一列重复值的位置。以下是代码的示例输出:

AppID   EmpID   EmpName
2002912 81555   NULL
2002912 81588   Jenn - 81588
2026880 9328    NULL
2026880 9628    Brad  - 09628
2027065 92174   Julie - 92174
2027065 92714   NULL
2028989 72138   NULL
2028989 91366   Alan - 91366
2029233 17438   NULL
2029233 53712   Brad - 53712
2031585 37902   NULL
2031588 17723   Richard - 17723
2031591 54551   Paula - 54551
2031593 52240   Sarah - 52240
2031597 72778   Daisy - 72778
2031603 12659   NULL

请注意,第一个coulmn(AppID)没有重复项,相应的列EmpName可能是Null或有一些值。我想删除AppID'sEmpName的所有重复null

如果没有唯一AppID的空值(参考最后一行),这可能是直截了当的,我也无法进行硬编码,因为我处理的是大量数据。

另请注意,所有这三列都来自不同的表,并且已经LEFT JOINAppID表。如果您需要查看代码,请告诉我,我没有在此处粘贴,因为它有点复杂,但可能不需要。

感谢任何形式的帮助和建议。谢谢。

2 个答案:

答案 0 :(得分:4)

在CTE中使用ROW_NUMBER函数,然后选择第一行。虽然如果有多个EmpName是NOT NULL,你只能按字母顺序获得第一个。

WITH AppAndEmp AS
(
    SELECT
        AppID
        , EmpID
        , EmpName
        , ROW_NUMBER() OVER(PARTITION BY AppId
                       ORDER BY (CASE WHEN EmpName IS NULL THEN 0 ELSE 1 END) DESC
                                , EmpName) AS EmpOrder

    FROM
        dbo.App
        LEFT JOIN dbo.Emp
            ON  App.AppId = Emp.AppId
)

SELECT
    *

FROM
    AppAndEmp

WHERE
    EmpOrder = 1

答案 1 :(得分:1)

修改

@djphatic:感谢您的评论。我纠正了我的回答。

-- These are those who have set a EmpName but have an invalid row too
select * from data where AppID in (
    select AppID from data group by AppID having count(AppID) > 1
)
and empname is not null
union
-- These are those who MIGHT have set a EmpName or NULL
select * from data where AppID in (
    select AppID from data group by AppID having count(AppID) = 1
)

=> SQLFiddle


对于故障,我将此前 不正确 的答案留在此处:< / em>的

你可以尝试这个:

select AppID,  min(empid) EmpID, min(EmpName) EmpName 
from data
group by AppID

SQLFiddle: http://sqlfiddle.com/#!3/67cf0/1/0

  

MIN忽略任何空值。

SQL Server中的MIN文档:http://msdn.microsoft.com/en-us/library/ms179916.aspx