在where子句中使用'stuff'变量

dwthyt8l  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(342)

下面是我们使用的查询代码:

SELECT 
    CONVERT(DATE, Nominations.Nomination_Date_Created) AS Nomination_Date_Created, 
    Nominations.Nomination_Status,  
    (CASE 
        WHEN MIN(EPORT.dbo.FDA_Divisions.division_name) = MAX(EPORT.dbo.FDA_Divisions.division_name) 
           THEN MIN(EPORT.dbo.FDA_Divisions.division_name) 
           ELSE 'Multiple Divisions' 
     END) AS Employee_Division, 
    Nominations.Nomination_Awarded_For, 
    Nominations.Nomination_Awarded_Other, 
    Nom.First_Name + ' ' + Nom.Last_Name AS Nominator_Name, 
    Nominations.Nomination_Group_UUID, 
    Nominations.Nomination_Group_Name, 
    Nominations.Nomination_Group_Time_off_Sum, 
    Nominations.Nomination_Group_Cash_Sum, 
    Nominations.Nomination_Type, 
    Nominations.Nomination_Identifier, Nominations.Nomination_Employee_UUID, 
    Nominations.Nomination_Nominator_ID, Nominations.Nomination_NOAC,
    STUFF((SELECT ', ' + NOMGroup.division_name  
           FROM vw_group_nomination_divisions NOMGroup
           WHERE NOMGroup.Nomination_Group_UUID = Nominations.Nomination_Group_UUID
           FOR XML PATH('')), 1, 1, '') divList          
FROM             
    Nominations 
INNER JOIN
    ePort.dbo.Employees AS Employees_1 ON Employees_1.CapHR_ID = Nominations.Nomination_Employee_CapHR_ID 
LEFT OUTER JOIN
    ePort.dbo.FDA_Offices ON Employees_1.office_id = ePort.dbo.FDA_Offices.office_id 
LEFT OUTER JOIN
    ePort.dbo.FDA_Centers ON Employees_1.center_ID = ePort.dbo.FDA_Centers.Center_ID 
LEFT OUTER JOIN
    ePort.dbo.FDA_Divisions ON Employees_1.division_id = ePort.dbo.FDA_Divisions.division_ID 
LEFT OUTER JOIN
    ePort.dbo.Employees AS Nom ON Nominations.Nomination_Nominator_ID = Nom.CapHR_ID 
LEFT OUTER JOIN
    ePort.dbo.Employees AS NomAppRTO ON Nominations.Nomination_Approving_Officer_NED_ID = NomAppRTO.CapHR_ID
GROUP BY 
    CONVERT(DATE, Nominations.Nomination_Date_Created), 
    Nominations.Nomination_Awarded_For, Nominations.Nomination_Status, 
    Nominations.Nomination_Awarded_Other, 
    Nom.First_Name + ' ' + Nom.Last_Name, 
    Nominations.Nomination_Type, Nominations.Nomination_Group_UUID, 
    Nominations.Nomination_Group_Name, 
    Nominations.Nomination_Group_Time_off_Sum, 
    Nominations.Nomination_Group_Cash_Sum, 
    Nominations.Nomination_Identifier, Nominations.Nomination_Type, 
    Nominations.Nomination_Employee_UUID, 
    Nominations.Nomination_Nominator_ID, Nominations.Nomination_NOAC
HAVING        
    (Nominations.Nomination_Type = 'Group') 
    AND (YEAR(CONVERT(DATE, Nominations.Nomination_Date_Created)) IN ('2020')) 
ORDER BY 
    Nomination_Date_Created DESC, Nominations.Nomination_Group_UUID

输出:

| Id                                   | divList           |
+--------------------------------------+-------------------+
| 3462BF9B-5056-9C58-994BFFC6A38E7368  | DLR, DTD, OHCM    |
| 3B8202C2-5056-9C58-99C591AA86B3A1C9  | OHCM              |
| CB5A722C-5056-9C58-9983C1F6C66C0AD7  | DTD, STMD         |

输出就是我们需要它的方式,然而,我们需要能够搜索它,而我们不能让它工作。那么,如何引用stuff函数在查询的where子句中创建的列“name”?
如果可能的话,我们需要在having或where子句中搜索'divlist'列中的值。例如divlist in('ohcm')。
每当我引用“divlist”时,就会出现错误:列名“divlist”无效。
这会将结果过滤到记录1和记录2。
我希望这能更好地解释这一点。

vh0rcniy

vh0rcniy1#

你不要绳子。使用更基本的逻辑:

having sum(case when division_name = 'ccc' then 1 else 0 end) > 0
bqjvbblv

bqjvbblv2#

临时表如何与视图关联。您需要将临时表与“提名”视图连接起来。

SELECT ID,
STUFF((SELECT ', ' + NOMGroup.division_name  
       FROM vw_group_nomination_divisions NOMGroup
       WHERE NOMGroup.Nomination_Group_UUID = nom.Nomination_Group_UUID
        FOR XML PATH('')), 1, 1, '') Name
FROM temp1
JOIN vw_group_nomination_divisions nom ON temp1.ID = nom.ID
WHERE Nominations.[Name] = 'ccc'
GROUP by ID

相关问题