我按如下方式构建了表:
SPKID SPKDate Engg1 Engg2 Engg3
————————————————————————————————————————————-
123. 2017-01-09 Amy. Jhon.
基本上上面的表格我希望在工程师去现场时记录工作津贴。每个spk将由最多3名工程师组成。所以,每个工程师都有3列。
现在我要做的是计算工程师每个月去的次数。而且我需要通过多列来计算。
预期结果:
约翰。 3
艾米。 2
感谢帮助
答案 0 :(得分:0)
如果我理解正确,那么你正在寻找能够实现这一目标的SQL。如果我的理解是错误的,这个答案可能不适用。
如果这是一张新表,我会考虑对其进行规范化,并将工程师分成一个单独的相关表。如果您这样做,则可以使用GROUP BY
和COUNT
相对轻松地提取数据。这需要更改代码,您需要设置一些逻辑来将工程师数限制为3.您应该能够使用约束(如主键)来防止同一工程师被添加两次。 / p>
http://www.mysqltutorial.org/mysql-group-by.aspx
新表可能只有两个字段:
SPKID
EngineerName
然后你可以这样写:
SELECT
se.EngineerName,
YEAR(s.SPKDate) AS SpkYear,
MONTH(s.SPKDate) AS SpkMonth,
COUNT(*) AS SpkTotal
FROM Spk AS s
SpkEngineers AS se ON se.SPKID = s.SPKID
GROUP BY
se.EngineerName,
YEAR(s.SPKDate),
MONTH(s.SPKDate)
ORDER BY
se.EngineerName,
YEAR(s.SPKDate),
MONTH(s.SPKDate)
<强>另外... 强>
如果您无法重新构建架构,则可以使用以下内容:
SELECT
se.EngineerName,
YEAR(s.SPKDate) AS SpkYear,
MONTH(s.SPKDate) AS SpkMonth,
COUNT(*) AS SpkTotal
FROM
(
SELECT DISTINCT
SPKID,
EngineerName
FROM
(
SELECT
SPKID,
Engg1 AS EngineerName
FROM Spk
UNION ALL
SELECT
SPKID,
Engg2 AS EngineerName
FROM Spk
UNION ALL
SELECT
SPKID,
Engg3 AS EngineerName
FROM Spk
) AS SpkEngineers
) AS se
INNER JOIN Spk AS s ON s.SPKID = se.SPKID
WHERE
se.EngineerName <> ''
AND se.EngineerName IS NOT NULL
GROUP BY
se.EngineerName,
YEAR(s.SPKDate),
MONTH(s.SPKDate)
ORDER BY
se.EngineerName,
YEAR(s.SPKDate),
MONTH(s.SPKDate)
您需要更改此设置以适合您的实际架构。
老实说,MySQL不是我的优势,所以可能有更直接的方式来做到这一点。只是想提出我的想法。