1

我有一个有几千行的表:从这里我需要为 columnWTE中的每个值提取列的总计band,包括总计为 0 的那些。我还需要每个总计都在它自己的列中,所以我可以轻松地更新汇总表。

我目前拥有的代码返回相关行的值:

SELECT 
   IF(band="E",WTE,0) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14

但是当我添加 SUM() 时,返回不正确(零,应该是几千):

SELECT 
   IF(band="E",SUM(WTE),0) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14

我查看了http://en.wikibooks.org/wiki/MySQL/Pivot_table,但我不明白应该如何将这种方法应用于我的问题。

我该怎么办?

4

3 回答 3

2

如果出现以下情况,您必须求和:

SELECT
    SUM(IF(band="E",WTE,0)) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
于 2012-09-29T13:04:29.020 回答
2

在这种特殊情况下,使用起来不是更容易WHERE吗?

SELECT SUM(WTE) AS `Band6_WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
AND band = "E"

对于一般情况,您可以使用,GROUP BY因为您说您需要每个波段的结果(列波段中的每个值):

SELECT band, SUM(WTE) AS `WTE`
FROM  `orthoptists` AS o
LEFT JOIN `instances` AS i
ON o.instance_FK = i.id
WHERE i.region = 14
GROUP BY band

这将给出 NULL 或 0,如果您愿意,您可以使用IFNULL将 NULL 转换为 0:

IFNULL(SUM(WTE), 0)

编辑:正如您在评论中指出的那样,您希望不同波段的多列而不是多行。一般来说,您不应该从 SQL 中执行此操作(使用第二个查询并从您的代码中执行枢轴操作),但也有例外情况,在 SQL 之外执行此操作要复杂得多,因此您可以这样做:

SELECT
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "E") AS `Band6_WTE`,
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "F") AS `Band7_WTE`,
    (SELECT SUM(WTE)
    FROM  `orthoptists` AS o
    LEFT JOIN `instances` AS i
    ON o.instance_FK = i.id
    WHERE i.region = 14
    AND band = "G") AS `Band8_WTE`

精确的语法可能需要一些调整(有些数据库要求每个SELECT都包含一个FROM子句,有些可能需要子选择中的每一列的名称,我认为 MySQL 没有,但我现在无法检查),但是无论如何,该原则都应适用。

于 2012-09-29T13:21:18.810 回答
1

Noody 已经解释了为什么您的原始查询会给您错误的结果。

原始查询在SELECT子句中有一个聚合函数。这告诉 MySQL 这是一个聚合。没有GROUP BY子句,因此它返回一行,将所有行视为一个组。

现在,band在这种情况下会发生什么?在 SQL 标准或任何其他 SQL 方言中,原始查询将返回错误,表示类似band未聚合。

MySQL 有一个称为隐藏列的(错误)功能,它允许这种语法。band它从所有行中取一个随机值进行比较。该值可能具有值“E”,在这种情况下,将返回所有 WTE 的总和。或者,它可能有另一个值,在这种情况下返回 0。

一般来说,您应该避免使用隐藏列。当您有聚合查询时,语句中的任何“裸”列SELECT也应该在子句中。GROUP BY

于 2012-09-29T14:39:06.190 回答