Можно ли использовать столбец ORDER BY вне GROUP BY? - PullRequest
7 голосов
/ 28 апреля 2011

, как сказал заголовок, вот мой код:

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, есть ли способ обойти это?

Ответы [ 6 ]

26 голосов
/ 28 апреля 2011

Примените другой агрегат, как насчет;

order by min([date_in])
1 голос
/ 28 апреля 2011

Порядок по тому же выражению, по которому вы группируете.

Лучше сгруппировать и упорядочить по 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))
0 голосов
/ 29 апреля 2011

используйте это

order by
1,2,3,4,5
0 голосов
/ 28 апреля 2011

Вы не можете иметь дело со столбцом 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

Я не могу проверить его в своей среде разработки, но я верю, что это дает вам идею.

0 голосов
/ 28 апреля 2011

Вы пытаетесь агрегировать по месяцам? Если это так, попробуйте:

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, но хотел бы включить некоторую ссылку на него.

0 голосов
/ 28 апреля 2011

Вы можете заказать только то, что можно использовать в операторе выбора. Date_in сам по себе невозможен в операторе выбора, поэтому вы не можете его использовать. В зависимости от вашей РСУБД вы можете делать следующее:

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)
...