отображать уникальную строку из двух таблиц - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть две таблицы (одна для первого квартала, одна для второго квартала), каждая из которых содержит сотрудников, которые получают бонусы в этом квартале. Каждый сотрудник имеет уникальный идентификатор в компании.

Я хочу получить всех сотрудников, у которых есть бонус в q1 или q2. дубликат сотрудника не требуется. Требуются Id и Сумма .

Ниже мое решение, я хочу выяснить, есть ли лучшее решение.

declare @q1 table (
EmployeeID int identity(1,1) primary key not null,
amount int
)


declare @q2 table (
EmployeeID int identity(1,1) primary key not null,
amount int
)


insert into @q1 
(amount)
select 1

insert into @q1 
(amount)
select 2

select * from @q1

insert into @q2
(amount)
select 1

insert into @q2 
(amount)
select 11

insert into @q2
(amount)
select 22

select * from @q2

Мое решение:

;with both as
(
select EmployeeID
from @q1
union
select EmployeeID
from @q2
)
select a.EmployeeID, a.amount
from @q1 as a
where a.EmployeeID in (select EmployeeID from both)
union all
select b.EmployeeID, b.amount
from @q2 as b
where b.EmployeeID in (select EmployeeID from both) and b.EmployeeID NOT in (select EmployeeID from @q1)
Result:

EmployeeID, Amount

1   1
2   2
3   22

Ответы [ 3 ]

1 голос
/ 15 февраля 2012
SELECT EmployeeID, Name, SUM(amount) AS TotalBonus
FROM
(SELECT EmployeeID, Name, amount
from @q1
UNION ALL
SELECT EmployeeID, Name, amount
from @q2) AS all 
GROUP BY EmployeeID, Name

Подвыбор СОЮЗ обеих таблиц вместе.GROUP BY дает вам по одной строке на сотрудника, а SUM означает, что если кому-то повезло в обоих qs, вы получите итоговую сумму.Я предполагаю, что это то, что вам нужно.

0 голосов
/ 15 февраля 2012

попробуйте это:

SELECT EmployeeID
FROM EmployeeList
WHERE EmployeeID IN
    (SELECT EmployeeID From QuarterOne  
        UNION
     SELECT EmployeeID From QuarterTwo)

ИЛИ с помощью JOIN

SELECT EmployeeID
FROM EmployeeList a INNER JOIN QuarterTwo b 
           ON a.EmployeeID = b.EmployeeID
     INNER JOIN QuarterTwo c 
           ON a.EmployeeID = c.EmployeeID

Это вернет все EmployeeID, которые имеют записи в любом квартале.

0 голосов
/ 15 февраля 2012

Попробуйте:

SELECT  DISTINCT q1.EmployeeID --- Same as q2.EmployeeID thanks to the join
        , q1.EmployeeName -- Not defined in OP source.
FROM    @q1 AS q1
        CROSS JOIN @q2 AS q2
WHERE   q1.amount IS NOT NULL
        OR q2.amount IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...