【问题标题】:How would I avoid extra NULL rows from case statement in new columns?我如何避免新列中 case 语句中的额外 NULL 行?
【发布时间】:2023-01-21 02:13:10
【问题描述】:

所以我有一个返回多行空值的 SQL 查询,我想复制值并现在全部删除。做这个的最好方式是什么?有任何想法吗?


 SELECT * FROM 
(
SELECT 
 PRS.[Task_id]
, PE_PRJ.[~Project]
,CASE ROLES.[Task_rolename]
    WHEN N'Primary Doc Controller' THEN USERS.[fullname]
    END AS [Primary Doc Controller]
,CASE ROLES.[Task_rolename]
    WHEN N'Construction Manager' THEN USERS.[fullname]
    END AS [Construction Manager]
, CASE ROLES.[Task_rolename]
    WHEN N'Buyer' THEN USERS.[fullname]
        END AS [Buyer]
    ,   CASE WHEN ROW_NUMBER() OVER (PARTITION BY PE_PRJ.[~Project], ROLES.[Task_rolename]  ORDER BY PRS.[createdon])
            = COUNT(1) OVER (PARTITION BY PE_PRJ.[~Project],ROLES.[Task_rolename] )
        THEN 1 ELSE 0 END AS [Latest Assignment Record]
  FROM [Task].[Task_projectresources] PRS
    left join [Task].[Task_projects] PRJ
        on PRS.[Task_project] =  PRJ.[Task_projectsid]
    left join [Task].[Task_roles] ROLES
        on PRS.[Task_role] =  ROLES.[Task_rolesid]
    left join [Task].[Project] PE_PRJ
        on FLOOR(PE_PRJ.[~Project]) = FLOOR(PRJ.[Task_project])
    left join [Task].[systemuser] USERS
        on PRS.[Task_resource] = USERS.[systemuserid]
    WHERE [~Project] = '19691.0019'
) LATEST
WHERE LATEST.[Latest Assignment Record] = '1'

当前结果

Task_id ~Project Primary Doc Controller Construction Manager Buyer Latest Assignment Record
1 19.2 NULL NULL Brenda 1
2 19.2 Garga NULL NULL 1
3 19.2 NULL Rus NULL 1

期望的结果

Task_id ~Project Primary Doc Controller Construction Manager Buyer Latest Assignment Record
1 19.2 Garga Rus Brenda 1
2 19.2 Garga Rus Brenda 1
3 19.2 Garga Rus Brenda 1

【问题讨论】:

  • 没有源数据和表格,这个问题很难回答

标签: sql case


【解决方案1】:

看起来您可以在 CASE 语句上使用 MAX 窗口函数,同时按以下方式进行分区:

  • PE_PRJ.[~Project],作为分区的假设
  • LATEST.[Latest Assignment Record],假设你正在过滤这个字段
...
,MAX(CASE ROLES.[Task_rolename]
          WHEN N'Primary Doc Controller' THEN USERS.[fullname]
     END) OVER(PARTITION BY PE_PRJ.[~Project], 
                            LATEST.[Latest Assignment Record]) AS [Primary Doc Controller]
,MAX(CASE ROLES.[Task_rolename]
          WHEN N'Construction Manager' THEN USERS.[fullname]
     END) OVER(PARTITION BY PE_PRJ.[~Project],
                            LATEST.[Latest Assignment Record]) AS [Construction Manager]
,MAX(CASE ROLES.[Task_rolename]
          WHEN N'Buyer' THEN USERS.[fullname]
     END) OVER(PARTITION BY PE_PRJ.[~Project],
                            LATEST.[Latest Assignment Record]) AS [Buyer]
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2012-03-15
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多