整个数据集的非重复计数,按月分组
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
我正在处理一个销售订单 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