Это должно предоставить вам значения EmployeeId
, где больше значений InOut
True, чем False
SELECT e.EmployeeId
FROM Employee AS e
INNER JOIN
(
SELECT tc.EmployeeID
, SUM(CASE
WHEN tc.InOut = 1 THEN 1 ELSE 0
END) AS InOutTrue
, SUM(CASE
WHEN tc.InOut = 0 THEN 1 ELSE 0
END) AS InOutFalse
FROM TimeClock AS tc
GROUP BY tc.EmployeeId
) AS t ON e.EmployeeId = t.EmployeeId
WHERE t.InOutTrue > t.InOutFalse
Две предложенные мной альтернативы показывают схожую производительность с моими ОЧЕНЬ МАЛЕНЬКИМИ неиндексированными данными испытаний. Я бы порекомендовал вам проверить их на основе ваших собственных данных, чтобы увидеть, имеют ли они какое-либо значение:
Это почти то же самое, но с использованием общего количества записей вместо InOutFalse.
SELECT e.EmployeeId
FROM Employee AS e
INNER JOIN
(
SELECT tc.EmployeeID
, COUNT(1) AS RecordCount
, SUM(CASE
WHEN tc.InOut = 1 THEN 1 ELSE 0
END) AS InOutTrue
FROM TimeClock AS tc
GROUP BY tc.EmployeeId
) AS t ON e.EmployeeId = t.EmployeeId
WHERE t.InOutTrue > RecordCount - t.InOutTrue
Я не уверен, что MySQL потребует CAST
, который я использовал здесь, но SQL Server сделал. (Это то, с чем я их проверял) Он не может выполнить SUM
для столбца BIT
.
SELECT e.EmployeeId
FROM Employee AS e
INNER JOIN TimeClock AS tc ON e.EmployeeId = tc.EmployeeId
GROUP BY e.EmployeeId
HAVING SUM(CAST(tc.InOut AS INT)) > (COUNT(1) - SUM(CAST(tc.InOut AS INT)))
Если все три действуют одинаково, то это сводится к личным предпочтениям.