mysql - 如果满足条件,则将列总和分配给另一列中某个日期的月份

标签 mysql sql

<强> DB-Fiddle

CREATE TABLE sales (
    id int auto_increment primary key,
    customerID VARCHAR(255),
    sales_date DATE,
    sales_volume INT,
    annual_unqiue_count INT
);

INSERT INTO sales
(customerID, sales_date, sales_volume, annual_unqiue_count)
VALUES 
("Customer_01", "2020-03-01", "600", "1"),
("Customer_01", "2020-03-25", "315", "0"),

("Customer_02", "2020-03-18", "208", "1"),
("Customer_02", "2020-07-25", "140", "0"),

("Customer_03", "2020-10-18", "400", "1"),
("Customer_03", "2020-12-06", "500", "0"),
("Customer_03", "2020-12-18", "438", "0"),
("Customer_03", "2020-12-25", "917", "0");

预期结果:

customerID      sales_date      SUM(annual_unqiue_count)    SUM(sales_volume)   sales_volume
Customer_01          3                  1                       600               915
Customer_01          3                  0                       315                 0
Customer_02          3                  1                       208               348
Customer_02          7                  0                       140                 0
Customer_03         10                  1                       400              2255
Customer_03         12                  0                       500                 0
Customer_03         12                  0                       438                 0
Customer_03         12                  0                       917                 0

在结果中我想分配 SUM(sales_volume)customermonth sales_date的其中有 annual_unqiue_count <> 0(注意:每个客户只能有一行拥有 Annual_unique_account <> 0)

引用this question的解决方案我尝试去:

SELECT
customerID,
MONTH(sales_date),
SUM(annual_unqiue_count),
SUM(sales_volume),
  (CASE WHEN annual_unqiue_count <> 0
  THEN SUM(sales_volume) over (PARTITION BY customerId)
  ELSE 0 END) AS sales_volume
FROM sales
GROUP BY 1,2;

但是,它没有给我正确的结果。
你知道我需要改变什么吗?

最佳答案

在这种情况下没有理由使用GROUP BY,因为您需要表的所有行。
使用 SUM() 窗口函数获取最后一列:

SELECT customerID,
       MONTH(sales_date) sales_date,
       annual_unqiue_count,
       sales_volume,
       annual_unqiue_count *
       SUM(sales_volume) OVER (PARTITION BY customerID) total_sales_volume 
FROM sales

也许您还需要一个 WHERE 子句来过滤特定年份的行?

请参阅demo .
结果:

> customerID  | sales_date | annual_unqiue_count | sales_volume | total_sales_volume
> :---------- | ---------: | ------------------: | -----------: | -----------------:
> Customer_01 |          3 |                   1 |          600 |                915
> Customer_01 |          3 |                   0 |          315 |                  0
> Customer_02 |          3 |                   1 |          208 |                348
> Customer_02 |          7 |                   0 |          140 |                  0
> Customer_03 |         10 |                   1 |          400 |               2255
> Customer_03 |         12 |                   0 |          500 |                  0
> Customer_03 |         12 |                   0 |          438 |                  0
> Customer_03 |         12 |                   0 |          917 |                  0

关于mysql - 如果满足条件,则将列总和分配给另一列中某个日期的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63579653/

相关文章:

android - 从 Android Lib 项目中获取资源

php - 使用 GROUP_CONCAT 的 SQL 查询出现意外结果

python - 使用 python sqlite3 将行插入 sqlite 数据库的简要语法

mysql - 如何提高MySQL查询速度

Javascript - 如何从 Accordion 中获取值到表单中

mysql - 如果 mysql 中没有行/空结果,则返回 0

mysql - MySQL 触发器中的 IF 语句

php - 有没有办法根据日期倒计时 4 周(一周一周)? PHP/MySQL

mysql - 不确定要对我的 SQL 表应用什么索引

sql - 更新语句根据另一个表的最大行设置列