0

我有一张桌子:

CREATE TABLE EXAMPLE
(
    ID          BIGINT(20),
    REPORTED_0      INTEGER(11),
    REPORTED_1      INTEGER(11),
    REPORTED_2      INTEGER(11),
    REPORTED_3      INTEGER(11),
    REPORTED_4      INTEGER(11),
    REPORTED_5      INTEGER(11),
    REPORTED_6      INTEGER(11),
    REPORTED_7      INTEGER(11),
    REPORTED_8      INTEGER(11),
    REPORTED_9      INTEGER(11),
    REPORTED_10     INTEGER(11)
 );

我需要按 id 求和。我这样做:

SELECT(ID, SUM)
        a.ID,
        (a.REPORTED_0 + a.REPORTED_2 + a.REPORTED_3 + a.REPORTED_4 +
        a.REPORTED_5 + a.REPORTED_6 + a.REPORTED_7 + a.REPORTED_8 +
        a.REPORTED_9 + a.REPORTED_10)
FROM EXAMPLE a
GROUP BY a.ID;

有没有更有效的方法来做这个总和?

对不起,但我对 sql 很菜鸟。

4

2 回答 2

2

鉴于您现有的架构,您的查询没有什么低效的。如果您正在寻找一些语法快捷方式来添加除一列之外的所有列而不命名列,您将找不到它。该SUM()函数用于汇总行,而不是列。

由于您从单个表中进行选择,因此不需要表别名,并且您错过了原始查询中的一列。此外,您的查询也不能很好地处理 NULL。您可能希望将它们视为 0。这是一个重写的查询,应该可以满足您的需求:

SELECT ID,
  (
    COALESCE(REPORTED_0,0) + COALESCE(REPORTED_1,0) + COALESCE(REPORTED_2,0) + 
    COALESCE(REPORTED_3,0) + COALESCE(REPORTED_4,0) + COALESCE(REPORTED_5,0) + 
    COALESCE(REPORTED_6,0) + COALESCE(REPORTED_7,0) + COALESCE(REPORTED_8,0) + 
    COALESCE(REPORTED_9,0) + COALESCE(REPORTED_10,0)
  ) AS REPORTED_TOTAL
FROM EXAMPLE
GROUP BY ID;
于 2012-08-06T18:23:35.330 回答
0

我认为这只是最有效的解决方案。你的表结构很差。如果我是你,你必须这样做表的结构是这样的:

Create Table Example
(
    ID              BigInt(20),
    ReportValue     Int(11),
    ReportIndex     Int(5)
)

所以这将是结构的查询:

SELECT  ID, SUM(ReportValue)
From    Example
GROUP BY    ID

好吧,这只是一个建议:)

于 2012-08-06T15:43:26.327 回答