我正在寻找一种创建查询以处理以下情况的方法。我有一个办公室数据库,具有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
这是我的最新尝试,但是即使在同一办公室,每个员工也可以获得多行。
答案 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