Как вытащить несвязанные данные в столбце из двух таблиц. - PullRequest
0 голосов
/ 13 октября 2019

У меня есть две таблицы:

BenPlan

BenPlanId   BenPlanName   BenPlanRate   EmployeeCost
-----------------------------------------------------
1           Medical       0.45          5000
2           Dental        0.75          2000

EmployeeBenPlan

EmployeeId   BenPlanId   EffectiveStart   EffectiveEnd
-------------------------------------------------------
1            1           1/1/2019         NULL
2            2           1/1/2019         NULL

Теперь ядолжен составить отчет, в котором будут отображаться следующие данные:

EmployeeBenPlanDetails

EmployeeId   BenPlanName   Rate    EmployeeCost   EffectiveStart    EffectiveEnd
--------------------------------------------------------------------------------
1            Medical       0.75    5000           1/1/2019          NULL
2            Dental        0.75    2000           1/1/2019          NULL

То есть, даже если план Бена является медицинским, мне нужно указать тариф для плана Dental в тарифной ставке. столбец, или я должен сказать, столбец ставки должен отображать результат следующего запроса:

SELECT Rate
FROM BenPlan
WHERE BenPlanName = 'Dental'

Как мы можем это сделать?

Ответы [ 4 ]

1 голос
/ 13 октября 2019

Вы можете использовать следующее решение. Это решение также работает, если вы добавляете новые записи в BenPlan:

SELECT ebp.EmployeeId, bp.BenPlanName, bp.BenPlanRate AS Rate, bp.EmployeeCost, ebp.EffectiveStart, ebp.EffectiveEnd
FROM EmployeeBenPlan ebp INNER JOIN (
  SELECT b1.BenPlanId, b1.BenPlanName, b1.EmployeeCost,
    CASE WHEN b1.BenPlanName = 'Medical' THEN b2.BenPlanRate ELSE b1.BenPlanRate END AS BenPlanRate
  FROM BenPlan b1 LEFT JOIN BenPlan b2 ON b1.BenPlanName = 'Medical' AND b2.BenPlanName = 'Dental'   
) bp ON ebp.BenPlanId = bp.BenPlanId
ORDER BY ebp.EmployeeId, ebp.BenPlanId

демо на dbfiddle.uk

0 голосов
/ 13 октября 2019

Вы, кажется, хотите два соединения с benplan, одно только для "Dental" и одно для названия фактического плана:

select ebp.EmployeeId, bp.BenPlanName,
       bpd.Rate, bp.EmployeeCost,   
       ebp.EffectiveStart, epb.EffectiveEnd
from employeebenplan ebp join
     benplan bp
     on ebp.BenPlanId = bp.BenPlanId join
     benplan bpd
     on bpd.BenPlanName = 'Dental'
0 голосов
/ 13 октября 2019

Вы можете написать этот запрос

SELECT E.EmployeeId,B.BenPlanName,(SELECT TOP(1) Rate
                                    FROM BenPlan
                                    WHERE BenPlanName = 'Dental') AS Rate,
        B.EmployeeCost,E.EffectiveStart,E.EffectiveEnd   
FROM BenPlan B
INNER JOIN EmployeeBenPlan E ON B.BenPlanId   = E.BenPlanId 
0 голосов
/ 13 октября 2019

Хорошо, следующий запрос возвращает ожидаемый результат. Он всегда возвращает Rate стоматологического плана.

SELECT
    EmployeeBenPlan.EmployeeId
    ,BenPlan.BenPlanName
    ,(
        SELECT Rate
        FROM BenPlan
        WHERE BenPlanName = 'Dental'
    ) AS Rate
    ,BenPlan.EmployeeCost
    ,EmployeeBenPlan.EffectiveStart
    ,EmployeeBenPlan.EffectiveEnd
FROM
    EmployeeBenPlan
    INNER JOIN BenPlan ON BenPlan.BenPlanId = EmployeeBenPlan.BenPlanId
;

Если таблица BenPlan может иметь более одной строки, где BenPlanName = 'Dental', то вам следует каким-то образом выбрать одну строку. Вы можете добавить TOP(1) с подходящим ORDER BY к подзапросу.

        SELECT TOP(1) Rate
        FROM BenPlan
        WHERE BenPlanName = 'Dental'
        ORDER BY BenPlanId
...