在我的查询中,我返回了每周发生的天数。一切工作正常,除了我得到多行返回,我只需要最高。因此,例如在我的查询中,如果TotalDays是3,我有1,2和3的行。如果它的4那么我有行1,2,3和4,等等我需要做什么我只得到最高的一个?我尝试使用ROW_NUMBER和MAX,但似乎无法弄清楚如何使用CASES来完成此操作。仅显示具有最高值的行
SELECT Employees.CustomerID, X.*, Customers.ReportID
FROM
(
SELECT
CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Su] = '1' THEN 1 ELSE 0 END AS DaysofWeek
FROM
Customers
) X, Employees INNER JOIN ON Employees.EmployeesID = Customers.EmployeesID
GROUP BY Employees.CustomerID, Customers.ReportID, X.DaysofWeek
关于此的更多细节。对于任何给定的EmployeeID,都可以有无限的ReportIDs,我想要返回所有这些,但仅适用于DaysofWeek最高的地方。
因此,EmployeeID 200可能会有报告1001和1002,每个报告每周2天返回。应该采取什么节目是
200 2 1001
200 2 1002
然而,什么是目前显示的是:
200 1 1001
200 2 1001
200 1 1002
200 2 1002
修改查询并增加了几个多个表,虽然一切都恢复的5
WITH sub AS(
SELECT Shift1.EmployeeID, X.*, Schedule.Services, Schedule.ReportID
FROM
(
SELECT
CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
CASE WHEN [Su] = '1' THEN 1 ELSE 0 END AS DaysofWeek
FROM
Schedule
) X, Shift1 INNER JOIN (Shift2 INNER JOIN Schedule ON Shift2.Shift2ID = Schedule.Shift2ID) ON Shift1.Shift1ID = Shift2.Shift1ID
GROUP BY Shift1.EmployeeID, Schedule.Services, Schedule.ReportID, X.DaysofWeek
)
SELECT X.*
FROM sub X
JOIN (SELECT EmployeeID, ReportID, MAX(DaysofWeek) AS DaysofWeek
FROM sub
GROUP BY EmployeeID, ReportID) Y
ON X.DaysofWeek = Y.DaysofWeek
and X.EmployeeID = Y.EmployeeID
and X.ReportID = Y.ReportID
什么是您的RDBMS? – Horaciux 2014-09-23 01:43:45
为什么员工上有一个CustomerID字段?我无法弄清楚你的模式。您在注释中将200称为EmployeeID,但在SQL语句中有Employees.CustomerID。 – 2014-09-23 01:44:34
我认为你正在通过客户表获得某种自动加入。您正在从Customers表中选择东西,这在技术上不是您正在选择的表格之一。要更清楚地在X中包含ReportID和employeeID – 2014-09-23 01:49:34