简体   繁体   English

设置多个日期范围的多个总和

[英]SETUP multiple sums with multiple date ranges

Here is the query I am trying to complete.这是我要完成的查询。

SELECT salesrep, 
    SUM(lines_total) AS OTSUM,
    SUM(order_type = 'NEW') OTNEW,
    SUM(order_type = 'REPEAT') OTREPEAT,
    SUM(lines_total 
      WHERE order_closed BETWEEN '2020-11-01' AND '2020-11-30') AS OTLMSUM
    SUM(lines_total 
      WHERE order_closed BETWEEN '2020-12-01' AND '2020-12-31') AS OTTMSUM
FROM `ranger_orders`
WHERE order_closed BETWEEN '2020-01-01' AND '2020-12-31'

Of course this fails, but how do I setup the SUMS for multiple date ranges, the WHERE date range at the end needs to stay as is.当然这会失败,但是我如何为多个日期范围设置 SUMS,末尾的 WHERE 日期范围需要保持原样。

For these lines:对于这些行:

SUM(lines_total WHERE order_closed BETWEEN '2020-11-01' AND '2020-11-30') AS OTLMSUM
SUM(lines_total WHERE order_closed BETWEEN '2020-12-01' AND '2020-12-31') AS OTTMSUM

You need CASE expressions for conditional aggregation, like:您需要条件聚合的CASE表达式,例如:

SUM(CASE WHEN order_closed BETWEEN '2020-12-01' AND '2020-12-31' THEN lines_total ELSE 0 END) AS OTTMSUM

For each of the sums, change BETWEEN '2020-12-01' AND '2020-12-31' accordingly.对于每个总和,相应地在BETWEEN '2020-12-01' AND '2020-12-31'进行更改。

To keep the data aligned on rows by salesrep, then you still need to add all the numbers - but you can substitute with zeroes where they are out of range....为了让销售代表在行上保持数据对齐,您仍然需要添加所有数字 - 但您可以在超出范围的地方用零替换....

SUM(IF (order_closed BETWEEN '2020-11-01' AND '2020-11-30', lines_total, 0)) AS OTLMSUM

You pointed out that you get a syntax error, but this looks like a semantic error:您指出出现语法错误,但这看起来像是语义错误:

SUM(order_type = 'NEW') OTNEW

Are you really trying to add these up?你真的想把这些加起来吗? Count them?算他们吗? Classify them?给他们分类?

Query might be something like...查询可能类似于...

SELECT salesrep, 
    SUM(lines_total) AS OTSUM,
    SUM(IF(order_type = 'NEW', 1, 0)) OTNEW,
    SUM(IF(order_type = 'REPEAT', 1, 0)) OTREPEAT,
    SUM(IF (order_closed BETWEEN '2020-11-01' AND '2020-11-30', lines_total, 0)) AS OTLMSUM
    SUM(if(order_closed BETWEEN '2020-12-01' AND '2020-12-31', lines_total, 0)) AS OTTMSUM
FROM `ranger_orders`
WHERE order_closed BETWEEN '2020-01-01' AND '2020-12-31'

Also, with aggregate queries (SUM, AVERAGE, COUNT...) you should have a GROUP BY clause....此外,对于聚合查询(SUM、AVERAGE、COUNT...),您应该有一个 GROUP BY 子句...。

GROUP BY salesrep 

However wouldn't it have been simpler to do this....但是,这样做不是更简单吗……

SELECT salesrep, 
    SUM(lines_total) AS OTSUM,
    SUM(IF(order_type = 'NEW', 1, 0)) AS OTNEW,
    SUM(IF(order_type = 'REPEAT', 1, 0)) AS OTREPEAT,
    DATE_FORMAT(order_closed, '%Y-%m') AS month,
    SUM(lines_total) AS otsum
FROM `ranger_orders`
WHERE order_closed BETWEEN '2020-01-01' AND '2020-12-31'
GROUP BY salesrep, DATE_FORMAT(order_closed, '%Y-%m')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM