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

在SQL Server中处理空值和重复记录,sql,sql-server,reporting-services,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

我有一个场景,我正在使用
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
,其中
EmpName
null

如果unique
AppID
没有空值(请参阅最后一行),这可能是直截了当的,而且我无法硬编码,因为我正在处理大量数据

另外,请注意,所有这三列都来自不同的表,并已被
左连接到
AppID
表。请让我知道,如果你需要查看代码,我没有粘贴在这里,因为它有点复杂,虽然可能不是必需的


感谢您提供的任何帮助和建议。谢谢您使用CTE中的行数功能,然后选择第一行。虽然如果有多个EmpName不为空,您只能按字母顺序获得第一个EmpName

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
编辑

@谢谢你的评论。我更正了我的答案

-- 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
)
=>


出于失败的原因,我在这里留下了我以前的错误答案:

你可以试试这个:

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

MIN忽略任何空值


SQL Server中MIN的文档:

使用
ROW\u NUMBER OVER(按appid顺序分区,首先按EmpName NULL)
并选择第2行。我
m不确定语法,但这是一般的想法。或者使用
ORDER by(EmpName为NULL时,大小写为0,否则1结束)`if NULLS FIRST不可用。我不想消除
null
值,因为
AppID
是唯一的。因此,在这种情况下,重复的
AppID的
和唯一的
AppID的
之间的差异将如何?这将导致不一致的结果。使用AppID2026880的示例数据,EmpId为9328,EmpName为Brad-09628。您的答案非常好,而且非常有效。我知道我们不应该仅仅因为说声谢谢就发表评论,但我真的无法阻止自己,因为这节省了我很多时间来得到答案。