【问题标题】:is it possible to use ORDER BY column not in the GROUP BY?是否可以使用不在 GROUP BY 中的 ORDER BY 列?
【发布时间】:2011-08-14 15:55:09
【问题描述】:

正如标题所说,这是我的代码:

SELECT
  material,
  SUM([Amount]) AS [Amount],
  RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
FROM
  [rec_stats]
GROUP BY
  material,
  RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
ORDER BY
  material,date_in

由于 date_in 导致代码无法运行,有没有办法解决这个问题?

【问题讨论】:

    标签: sql sql-server tsql group-by sql-order-by


    【解决方案1】:

    您只能按照 select 语句中可能使用的内容进行排序。 Date_in 本身在选择语句中是不可能的,因此您不能使用它。根据您的 RDBMS,您可以执行以下操作:

    SELECT
    material,
      SUM([Amount]) AS [Amount],
      RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
    FROM
      [rec_stats]
    GROUP BY
      material,
      RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
    ORDER BY
      material,RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
    

    【讨论】:

    • 但这会导致它按字母顺序排序,因为它已被转换为 varchar,我需要它按日期排序...
    【解决方案2】:

    按您分组的相同表达式排序。

    最好按月份的DATE 表示进行分组和排序。

    SQL Server 2008 中是:

    SELECT  material, SUM([Amount]) AS [Amount], DATEADD(d, 1 - DAY(GETDATE()), CAST(GETDATE() AS DATE))
    FROM    [rec_stats]
    GROUP BY
            material,
            DATEADD(d, 1 - DAY(GETDATE()), CAST(GETDATE() AS DATE))
    ORDER BY
            material, DATEADD(d, 1 - DAY(GETDATE()), CAST(GETDATE() AS DATE))
    

    【讨论】:

    • 但这会导致它按字母顺序排序,因为它已被转换为 varchar,我需要它按日期排序...
    • @dreamer:这就是 yyyy-mm-dd 格式的美妙之处;词汇排序是时间顺序。 :)
    【解决方案3】:

    应用另一个聚合,那么怎么样;

    order by min([date_in])
    

    【讨论】:

      【解决方案4】:

      您是否尝试按月汇总?如果是这样,请尝试:

      SELECT
        material,
        SUM([Amount]) AS [Amount],
        DATEPART(year, [date_in]) as y,
        DATEPART(month, [date_in]) as m,
        DATEPART(month, [date_in]) + ' ' + DATEPART(year, [date_in]) AS MonthYearCombined
      FROM
        [rec_stats]
      GROUP BY
        material,
        DATEPART(year, [date_in]),
        DATEPART(month, [date_in])
      ORDER BY
        material,y,m
      

      注意:您可能需要转换“MonthYearCombined”列中的值 - 我实际上建议您在代码而不是 SQL 中执行此操作,但希望包含对它的一些引用。

      【讨论】:

        【解决方案5】:

        您不能像原始查询那样处理 date_in 列。相反,您可以嵌套查询并像这样读取它:

        SELECT
          material,
          SUM([Amount]) AS [Amount],
          RIGHT(CONVERT(varchar(50), [date_in], 106), 8)
        FROM
        (
        Select material, Amount, RIGHT(CONVERT(varchar(50), [date_in], 106), 8) as DateIn
        From [rec_stats]
        ) X
        GROUP BY
          material,
          DateIn
        ORDER BY
          material,DateIn
        

        我无法在我的开发环境中对其进行测试,但我相信这给了你这个想法。

        【讨论】:

          【解决方案6】:

          使用这个

          order by
          1,2,3,4,5
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-18
            • 1970-01-01
            • 2011-06-28
            • 1970-01-01
            相关资源
            最近更新 更多