代码之家  ›  专栏  ›  技术社区  ›  user_78361084

订购此声明

  •  1
  • user_78361084  · 技术社区  · 13 年前

    我有以下陈述。结果返回,但记录没有排序。我做错什么了?

    SELECT * 
    FROM (
    SELECT name, date, SUM(volume) AS sumVolume, SUM(value) AS sumValue
    FROM table
    WHERE id = 12
    ) AS TempTable
    ORDER BY date DESC
    
    2 回复  |  直到 13 年前
        1
  •  0
  •   aefxx    13 年前

    此查询将无法按预期工作。使用 SUM (这是一个聚合函数)在派生表中会精确地返回一行-除非开始 GROUP BY 另一列。

    在您的示例中,即使您将 id 不过,您仍然只能得到一行(这是因为您将按单个ID分组)。改变 WHERE 语句以包含更多的ID并在派生表中对其进行分组。

    另外,看看 MySQL manual 对各种聚合函数进行分析,以了解它们的作用。

    当做

    编辑
    由于OP的要求有些明确,我将尽力帮助他回答以下问题:

    SELECT x.name, x.date, y.vol, y.val
      FROM table AS x,
          ( SELECT MAX(date) AS date, SUM(volume) AS vol, SUM(value) AS val
              FROM table
             WHERE id = 12 ) AS y
     WHERE x.id = 12,
       AND x.date = y.date
    
        2
  •  0
  •   Kevin Bedell    13 年前

    我相信这就是你想要的:

    SELECT * 
    FROM (
      SELECT name, date, SUM(volume) AS sumVolume, SUM(value) AS sumValue
      FROM table
      WHERE id = 12
      GROUP BY date
    ) AS TempTable 
    ORDER BY TempTable.date DESC
    

    这将为您提供每天的数量和价值之和,然后按天为您订购结果。

    在许多情况下,以前没有“分组依据”的版本不能正确地按日期求和。

    使用 ORDER BY TempTable.date 在outer select语句中,您希望按日期顺序显示的是内部查询的结果。