计算多列的不同值

时间:2018-01-09 23:03:27

标签: mysqli

我按如下方式构建了表:

SPKID     SPKDate    Engg1   Engg2   Engg3
————————————————————————————————————————————-
123.     2017-01-09       Amy.    Jhon.   

基本上上面的表格我希望在工程师去现场时记录工作津贴。每个spk将由最多3名工程师组成。所以,每个工程师都有3列。

现在我要做的是计算工程师每个月去的次数。而且我需要通过多列来计算。

预期结果:

约翰。 3

艾米。 2

感谢帮助

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你正在寻找能够实现这一目标的SQL。如果我的理解是错误的,这个答案可能不适用。

如果这是一张新表,我会考虑对其进行规范化,并将工程师分成一个单独的相关表。如果您这样做,则可以使用GROUP BYCOUNT相对轻松地提取数据。这需要更改代码,您需要设置一些逻辑来将工程师数限制为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不是我的优势,所以可能有更直接的方式来做到这一点。只是想提出我的想法。