SQL-запрос для возврата идентификатора, номера офиса и за каждый год, если в этом году есть счет для сотрудника - PullRequest
0 голосов
/ 22 сентября 2019

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

Мне нужно один раз отображать номер офиса для каждого сотрудника, указав год и показатель для каждого года, в котором был выставлен счет.Сотрудники могут находиться в нескольких офисах.

Office  Employee  Employee Name  Year1   Year2  Year3 Year4 Year5
12345   E5681718   Jane Smith       1       1      0    0      1
54321   E5681718   Jane Smith       1       0      0    1      0

Я пробовал несколько разных вещей, но ни одна из них не работает.Я новичок в SQL, поэтому рассуждения о том, что я делаю, могут вообще не иметь смысла.Я пытался использовать

;WITH
Employees AS (SELECT DISTINCT employeeID, OfficeNumber
FROM dbo.Employee
WHERE OfficeNumber IN ('12345', '78901', '54321')
AND employeeID IS NOT NULL
AND employeeID <> ' ')

, Invoices AS (
SELECT employeeID
CASE WHEN  COUNT(*) > '0'  AND i.adddate >= '2019-01-01'    THEN '1' else 
'0' END AS Inv2019 ,
CASE WHEN COUNT(*) > '0'  AND i.adddate BETWEEN '2018-01-01'  AND  '2019- 
01-01' THEN '1' else '0' END AS Inv2018 ,
CASE WHEN COUNT(*) > '0'  AND i.adddate BETWEEN '2017-01-01'  AND  '2018- 
01-01' THEN '1' else '0' END AS Inv2017 ,
CASE WHEN COUNT(*) > '0'  AND i.adddate BETWEEN '2016-01-01'  AND  '2017- 
01-01'  THEN '1' else '0' END AS Inv2016,
FROM Invoices i
WHERE  employeeID IS NOT NULL
 AND employeeID <> ' '
GROUP BY employeeID ,  AddDate)

SELECT e.OfficeNumber, e.employeeID, iv.Inv2018, iv.Inv2017, iv.Inv2016
LEFT OUTER JOIN Invoices iv ON p.PreparerID = pr.PreparerID
GROUP BY e.OfficeNumber, iv.employeeID, iv.Inv2018, iv.Inv2017, iv.Inv2016

Также пытался тянуть за каждый год, используя 'Имея'

;WITH
Employees AS (SELECT DISTINCT employeeID, OfficeNumber
FROM dbo.Employee
WHERE OfficeNumber IN ('12345', '78901', '54321')
AND employeeID IS NOT NULL
AND employeeID <> ' ')

,Inv19 AS (SELECT DISTINCT employeeID, OfficeNumber , YEAR(adddate) Inv19
FROM Invoices i
WHERE adddate BETWEEN '2019-01-01'  AND   GETDATE()
AND employeeID IS NOT NULL
AND employeeID <> ' '
GROUP BY employeeID,  OfficeNumber, AddDate
HAVING COUNT(*) > '0')

,Inv18 AS (SELECT DISTINCT employeeID, OfficeNumber , YEAR(adddate) Inv18
FROM Invoices i
 WHERE adddate BETWEEN adddate BETWEEN '2018-01-01'  AND '2019-01-01' 
AND employeeID IS NOT NULL
AND employeeID<> ' '
GROUP BY employeeID,  OfficeNumber, AddDate
HAVING COUNT(*) > '0'
)
,Inv17 AS (SELECT DISTINCT employeeID, OfficeNumber , YEAR(adddate) Inv17
FROM Invoices i
 WHERE adddate BETWEEN '2017-01-01'  AND   '2018-01-01'
AND employeeID IS NOT NULL
AND employeeID<> ' '
GROUP BY employeeID,  OfficeNumber, AddDate
HAVING COUNT(*) > '0'
)

Select e.employeeID, e.OfficeNumber , Inv19, Inv18, Inv17
from Employees e
Left outer join Inv19 i9 on e.employeeID = i9.employeeID
Left outer join Inv18 i8 on e.employeeID = i8.employeeID
Left outer join Inv17 i7 on e.employeeID = i7.employeeID

Это была моя последняя попытка, но я получаю несколько строк на сотрудника, даже когда этоэто тот же офис.

1 Ответ

0 голосов
/ 22 сентября 2019

Требуется условная агрегация:

SELECT e.employeeID, e.OfficeNumber, e.employeeName,
       MAX(CASE WHEN YEAR(i.add_date) = 2019 THEN 1 ELSE 0 END) as inv_2019,
       MAX(CASE WHEN YEAR(i.add_date) = 2018 THEN 1 ELSE 0 END) as inv_2018,
       MAX(CASE WHEN YEAR(i.add_date) = 2017 THEN 1 ELSE 0 END) as inv_2017,
       MAX(CASE WHEN YEAR(i.add_date) = 2016 THEN 1 ELSE 0 END) as inv_2016,
       MAX(CASE WHEN YEAR(i.add_date) = 2015 THEN 1 ELSE 0 END) as inv_2015
FROM dbo.Employee e LEFT JOIN
     invoices i
     ON i.employeeID = e.employeeID
WHERE e.OfficeNumber IN ('12345', '78901', '54321') AND
      e.employeeID <> ' '  -- handles NULL values
GROUP BY e.employeeID, e.OfficeNumber, e.employeeName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...