【问题标题】:Update using CASE statements on INNER join在 INNER 连接上使用 CASE 语句更新
【发布时间】:2014-08-13 02:25:46
【问题描述】:

我有两张桌子

1.Project_Cust_Packages__c


Project_Id__c | LOV_Name__c |


101       |  PAS        |
101       |  PMS        | 
101       |  FTR        |

2.AAProj_Tbl


 ID | ISPAS |ISPMS |ISFTR |

101 |  NULL | NULL | NULL |

我的查询是..

    UPDATE AAProj_Tbl 

SET ISPAS=
CASE 
WHEN A.[LOV_Name__c]='PAS' THEN 'Y'
WHEN ISPAS='Y' THEN 'Y'
ELSE 'N'
END

,ISPMS=
CASE 
WHEN A.[LOV_Name__c]='PMS' THEN 'Y'
WHEN ISPMS='Y' THEN 'Y'
ELSE 'N'
END

,ISFTR=
CASE 
WHEN A.[LOV_Name__c]='FTR' THEN 'Y'
WHEN ISFTR='Y' THEN 'Y'
ELSE 'N'
END 

FROM [Project_Cust_Packages__c] A inner join AAProj_Tbl B
on B.ID=A.[Project_Id__c]

结果是

AAProj_Tbl


 ID | ISPAS |ISPMS |ISFTR |

101 |   N   |  N   | Y    |

但结果应该是


 ID | ISPAS |ISPMS |ISFTR |

101 |   Y   |  Y   | Y    |

Y,Y,Y 在所有列中,因为: Project_Cust_Package_c 表的项目有 FTR,PMS,FTR...

【问题讨论】:

    标签: sql database data-warehouse data-analysis


    【解决方案1】:

    在构建这样的查询时(即从多行更新单行中的多个列),您需要确保两个表都转换为一对一的关系。一种方法是旋转表 A,如下所示:

    UPDATE AAProj_Tbl 
    
    SET ISPAS=
    CASE 
    WHEN A.[PAS] > 0 THEN 'Y'
    ELSE 'N'
    END
    
    ,ISPMS=
    CASE 
    WHEN A.[PMS] > 0 THEN 'Y'
    ELSE 'N'
    END
    
    ,ISFTR=
    CASE 
    WHEN A.[FTR] > 0 THEN 'Y'
    ELSE 'N'
    END 
    
    FROM 
    (SELECT [Project_Id__c], 
    SUM(CASE WHEN [LOV_Name__c] = 'PAS' THEN 1 ELSE 0 END) AS [PAS],
    SUM(CASE WHEN [LOV_Name__c] = 'PMS' THEN 1 ELSE 0 END) AS [PMS],
    SUM(CASE WHEN [LOV_Name__c] = 'FTR' THEN 1 ELSE 0 END) AS [FTR],
    FROM [Project_Cust_Packages__c] GROUP BY [Project_Id__c]) AS A
    inner join AAProj_Tbl B
    on B.ID=A.[Project_Id__c]
    

    【讨论】:

    • 感谢 cha,它可以工作...为了在 SQL Server 中执行,我在 case 语句中添加了 WHEN。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多