SQL: агрегации по разделам по - PullRequest
0 голосов
/ 11 апреля 2020

Запрос: с учетом только итальянских маршрутов, для каждой категории товаров и для каждого года

  • выберите среднесуточный доход для каждого месяца

  • общий ежемесячный доход с начала года

SQL:

SELECT
  gc.GoodCategory,
  tm.Month,
  tm.Year,
  SUM(ro.Income) / COUNT(DISTINCT tm.Date),
  SUM(ro.Income) OVER (PARTITION BY gc.GoodCategory, tm.Year 
    ORDER BY tm.Month ROWS UNBOUNDED PRECEDING)

FROM FactRoutes ro,
     DimLocation dp,
     DimLocation ds,
     DimGoodCategory gc,
     DimTime tm

WHERE ro.DepartureID = dp.LocationID
    AND ro.DestinationID = ds.LocationID
    AND ro.GoodCategoryID = gc.GoodCategoryID
    AND ro.GoodTimeID = tm.GoodTimeID
    AND dp.State = 'Italy'
    AND ds.State = 'Italy'

GROUP BY gc.GoodCategory,
     tm.Month,
     tm.Year;

Но с ошибкой ниже

Column 'FactRoutes.Income' is invalid in the select list
because it is not contained in either an aggregate function
or the GROUP BY clause.

какой лучший способ справиться с этим?

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, что вы хотите:

SELECT
  gc.GoodCategory,
  tm.Month,
  tm.Year,
  SUM(ro.Income) / COUNT(DISTINCT tm.Date),
  SUM(SUM(ro.Income)) OVER (PARTITION BY gc.GoodCategory, tm.Year ORDER BY tm.Month)
FROM FactRoutes ro
INNER JOIN DimLocation dp ON ro.DepartureID = dp.LocationID
INNER JOIN DimLocation ds ON ro.DestinationID = ds.LocationID
INNER JOIN DimGoodCategory gc ON ro.GoodCategoryID = gc.GoodCategoryID
INNER JOIN DimTime tm ON ro.GoodTimeID = tm.GoodTimeID
WHERE dp.State = 'Italy' AND ds.State = 'Italy'
GROUP BY gc.GoodCategory, tm.Month, tm.Year;

Суть в том, что для того, чтобы ваш запрос не был допустимым агрегированным запросом, вам нужно использовать функцию агрегирования в оконной функции, например SUM(SUM(ro.Income)) OVER (...) вместо просто SUM(ro.Income) OVER(...), поэтому вы получаете сумму окон за предыдущие группы записей.

Другие примечательные моменты:

  • всегда использовать явные объединения (с ключевым словом ON), а не старые школы, неявные объединения (с запятые в предложении FROM), синтаксис которых вышел из употребления в течение десятилетий

  • ROWS UNBOUNDED PRECEDING не требуется; ваша оконная функция имеет предложение ORDER BY, так что это то, что она делает в любом случае

...