Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以返回ID、办公室编号以及员工每年是否有发票_Sql_Sql Server - Fatal编程技术网

SQL查询以返回ID、办公室编号以及员工每年是否有发票

SQL查询以返回ID、办公室编号以及员工每年是否有发票,sql,sql-server,Sql,Sql Server,我正在寻找一种方法来创建一个查询来处理以下场景。我有一个office数据库、ID为的员工数据库和一个包含销售发票的数据库表。我需要返回每个员工每年的记录,如果该员工在该年有发票以及发票的办公室编号,则记录为是或否、1或0 我需要为每个员工显示一次办公室编号,以及有发票的年份和每年的指标。员工可以在多个办公室工作 Office Employee Employee Name Year1 Year2 Year3 Year4 Year5 12345 E5681718 Jane Smi

我正在寻找一种方法来创建一个查询来处理以下场景。我有一个office数据库、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
还尝试每年使用“Having”进行拉动

;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

这是我最近的一次尝试,但即使是在同一办公室,我也会为每个员工获取多行数据。

您想要条件聚合:

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

您好GrangerG,请您更正这行:其中adddate介于“2018-01-01”和“2019-01-01”之间。如果你这样做,别人会更容易帮助你。谢谢@格兰杰。样本数据真的很有用。你想展示多少年?