Различное количество для всего набора данных, сгруппированных по месяцам - PullRequest
0 голосов
/ 19 декабря 2018

Я имею дело с таблицей заказов на продажу (ORDER), которая выглядит примерно так (обновлено 2018/12/20, чтобы быть ближе к моему фактическому набору данных):

SOID         SOLINEID         INVOICEDATE         SALESAMOUNT     AC
5            1                2018-11-30          100.00          01
5            2                2018-12-05          50.00           02
4            1                2018-12-12          25.00           17
3            1                2017-12-31          75.00           03
3            2                2018-01-03          25.00           05
2            1                2017-11-25          100.00          17
2            2                2017-11-27          35.00           03
1            1                2017-11-20          15.00           08
1            2                2018-03-15          30.00           17
1            3                2018-04-03          200.00          05

Я могувычислите средние продажи по SOID и SOLINEID:

SELECT SUM(SALESAMOUNT) / COUNT(DISTINCT SOID) AS 'Total Sales per Order ($)',
    SUM(SALESAMOUNT) / COUNT(SOLINEID) AS 'Total Sales per Line ($)'
FROM ORDER

Это, кажется, дает очень хороший ответ, но мне тогда дали дополнительное ограничение, что этот подсчет должен быть сделан по году и месяцу.Я думал, что мог бы просто добавить

GROUP BY YEAR(INVOICEDATE), MONTH(MONTH)

Но это агрегирует SOID, а затем выполняет COUNT (DISTINCT SOID).Это становится проблемой с SOID, которые появляются через несколько месяцев, что является довольно распространенным явлением, поскольку мы выставляем счет при отгрузке.

Я хочу получить что-то вроде этого:

Year     Month     Total Sales Per Order    Total Sales Per Line
2018     11        0.00                     

Боль в большом пальце торчитзаключается в том, что мне нужен какой-то способ определить, в каком месяце и году SOID будет агрегирован, если он охватывает несколько;для этой цели я бы использовал MAX (INVOICEDATE).

Оттуда, однако, я просто не уверен, как с этим справиться.С?Подзапрос?Что-то другое?Я был бы признателен за любую помощь, даже если она просто указывала в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вот результаты, но в образце данных нет строк enuf для отображения месяцев ...

SELECT
    mDateYYYY,
    mDateMM,
    SUM(SALESAMOUNT) / COUNT(DISTINCT t1.SOID) AS 'Total Sales per Order ($)',
    SUM(SALESAMOUNT) / COUNT(SOLINEID) AS 'Total Sales per Line ($)'
FROM DCORDER as t1
left join
    (Select
     SOID
     ,Year(max(INVOICEDATE)) as mDateYYYY
     ,Month(max(INVOICEDATE)) as mDateMM
From DCOrder 
Group By SOID
     ) as t2
 On t1.SOID = t2.SOID

 Group by mDateYYYY, mDateMM

mDateYYYY   mDateMM Total Sales per Order ($)   Total Sales per Line ($)
2018        12      87.50                       58.33

Я использовал новый SQL все еще MAX (INVOICEDATE) (не выше), с новым 12/ 20 данных, и исключая AC = 17.

YYYY    MM  Total Sales per Order ($)   Total Sales per Line ($)
2017    11   35.00                       35.00
2018     1  100.00                       50.00
2018     4  215.00                      107.50
2018    12  150.00                       75.00
0 голосов
/ 19 декабря 2018

Вы должны выбрать Год () и месяц () для invocedate и сгруппировать по

SELECT YEAR(INVOICEDATE) year
  , MONTH(INVOICEDATE) month
  , SUM(SALESAMOUNT) / COUNT(DISTINCT SOID) AS 'Total Sales per Order ($)'
  , SUM(SALESAMOUNT) / COUNT(SOLINEID) AS 'Total Sales per Line ($)'
FROM ORDER
GROUP BY YEAR(INVOICEDATE), MONTH(INVOICEDATE)
...