整个数据集的非重复计数,按月分组

Distinct count for entire dataset, grouped by month

我正在处理一个销售订单 table (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 跨越多个 SOID 将在哪个月和年聚合;为此,我会使用 MAX(INVOICEDATE).

然而,从那里开始,我只是不确定如何解决这个问题。和?子查询?还有别的吗?我将不胜感激任何帮助,即使它只是指向正确的方向。

您应该 select Year() 和 month() 用于调用和分组

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)

这是结果,但数据样本没有 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