如何结合这个查询

时间:2010-07-29 02:39:47

标签: tsql

WITH LatestJob AS (SELECT * FROM(SELECT  
   aId 
   , Position 
   , StartDate 
   ,  Enddate 
   ,SpecializationId
   ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY  
             CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END ASC,  
             (CAST(Enddate as datetime)) DESC) AS RN 
FROM EmploymentDetails ed) E WHERE RN=1 
)
                      ,EarliestStart AS (SELECT aID
                                                , sum(DATEDIFF(YEAR,Startdate, isnull(Enddate,getdate()))) AS YearsExperience 
                                         FROM EmploymentDetails GROUP BY aId)
                      SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
                      , lj.Position AS LatestPosition
                      ,aps.cId,aps.ApStatusID as ApplicationStatus,aps.sId as SpecializationId
                      ,  YearsExperience
                      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
                      FROM Users u JOIN LatestJob lj ON u.Id = lj.aid 
                  JOIN EarliestStart ye ON ye.aId = u.Id 
                  JOIN ApplicantDetails ad ON ad.aId = u.Id
                  JOIN ApplicationStatus aps ON aps.aId=u.Id    


WITH LatestJob AS (SELECT * FROM(SELECT  
   aId 
   , Position 
   , StartDate 
   ,  Enddate 
   ,SpecializationId    
   ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY  
             CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END ASC,  
             (CAST(Enddate as datetime)) DESC) AS RN 
FROM EmploymentDetails ed) E WHERE RN=1 
)
                      ,EarliestStart AS (SELECT aID
                                                , sum(DATEDIFF(YEAR,Startdate, isnull(Enddate,getdate()))) AS YearsExperience 
                                         FROM EmploymentDetails GROUP BY aId)
                      SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
                      , lj.Position AS LatestPosition
                      ,  YearsExperience
                      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
                      FROM Users u JOIN LatestJob lj ON u.Id = lj.aid 
                  JOIN EarliestStart ye ON ye.aId = u.Id 
                  JOIN ApplicantDetails ad ON ad.aId = u.Id
                    where u.RoleId=3 
                    and u.UserStatusId=1
                    and lj.SpecializationId=38 --@sId

2 个答案:

答案 0 :(得分:0)

我认为这可能会这样做(我也让它更具可读性):

    WITH LatestJob AS (
    SELECT * FROM
        (SELECT  
            aId 
           ,Position 
           ,StartDate 
           ,Enddate 
           ,SpecializationId
           ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY 
                 (CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END) ASC
                ,CAST(Enddate AS datetime) DESC
            ) AS RN 
        FROM 
            EmploymentDetails ed
        ) E 
    WHERE RN = 1 
    )
    ,EarliestStart AS (
        SELECT 
             aID
            ,SUM(DATEDIFF(YEAR, Startdate, ISNULL(Enddate,GETDATE()))) AS YearsExperience 
        FROM 
            EmploymentDetails 
        GROUP BY 
            aId
    )
    (
    SELECT
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,aps.cId
        ,aps.ApStatusID AS ApplicationStatus
        ,aps.sId AS SpecializationId
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    JOIN 
        ApplicationStatus aps ON aps.aId=u.Id    
    )
UNION ALL
    (
    SELECT 
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    WHERE 
        u.RoleId = 3 
        AND u.UserStatusId = 1
        AND lj.SpecializationId = 38 --@sId
)

希望我没有丢失任何信息或在途中将其复制错误。它只能正确解析,所以我不确定它是否会实际返回你想要的内容。

答案 1 :(得分:0)

尝试以下方法:

WITH LatestJob AS (
    SELECT * FROM (
        SELECT  
           aId 
           , Position 
           , StartDate 
           ,  Enddate 
           ,SpecializationId
           ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY  
                     CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END ASC,  
                     (CAST(Enddate as datetime)) DESC) AS RN 
        FROM EmploymentDetails ed) E WHERE RN=1 
    )
), EarliestStart AS (
    SELECT aID, sum(DATEDIFF(YEAR,Startdate, isnull(Enddate,getdate()))) AS YearsExperience 
    FROM EmploymentDetails GROUP BY aId
)

  SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
      , lj.Position AS LatestPosition
      ,aps.cId,aps.ApStatusID as ApplicationStatus,aps.sId as SpecializationId
      ,  YearsExperience
      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
  FROM Users u 
  JOIN LatestJob lj ON u.Id = lj.aid 
  JOIN EarliestStart ye ON ye.aId = u.Id 
  JOIN ApplicantDetails ad ON ad.aId = u.Id
  JOIN ApplicationStatus aps ON aps.aId=u.Id    

  UNION ALL

  SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
      , lj.Position AS LatestPosition
      , '' as cId, '' as ApplicationStatus, '' as SpecializationId
      ,  YearsExperience
      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
  FROM Users u 
  JOIN LatestJob lj ON u.Id = lj.aid 
  JOIN EarliestStart ye ON ye.aId = u.Id 
  JOIN ApplicantDetails ad ON ad.aId = u.Id
  WHERE u.RoleId=3 
    AND u.UserStatusId=1
    AND lj.SpecializationId=38 --@sId