SQL查询以返回ID,办公室编号以及每年(如果该年中有该员工的发票)每年

时间:2019-09-22 19:08:16

标签: sql sql-server

我正在寻找一种创建查询以处理以下情况的方法。我有一个办公室数据库,具有ID的员工数据库和具有销售发票的数据库表。如果某人在当年有发票以及发票的办公室编号,则我需要返回每个员工的记录,并选择是或否(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 :(得分:0)

您需要条件聚合:

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