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

Exc*_*arn 2 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
Run Code Online (Sandbox Code Playgroud)

请注意,第一个 coulmn ( AppID) 几乎没有重复项,并且相应的列EmpName要么是Null要么 具有某个值。我想消除isAppID's处的所有重复项。EmpNamenull

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

另请注意,所有这三列都来自不同的表并已LEFT JOIN到达AppID表。如果您需要查看代码,请告诉我,我没有将其粘贴到此处,因为它有点复杂,但可能不是必需的。

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

mhe*_*all 5

在 CTE 中使用 ROW_NUMBER 函数,然后选择第一行。但如果有多个不为 NULL 的 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
Run Code Online (Sandbox Code Playgroud)