【问题标题】:In SQL how to get percent of group by date?在 SQL 中如何按日期获取分组的百分比?
【发布时间】:2021-02-03 04:11:44
【问题描述】:

我正在尝试从以下数据生成一个 SQL 查询,其中的结果是每个日期按地区划分的总销售额百分比。同一日期同一地区可以有多个条目,我需要求和

Date Region Sales
Jan 1, 2021 Northeast 100
Jan 1, 2021 Northeast 80
Jan 1, 2021 Midwest 75
Jan 1, 2021 West. 120
Jan 9, 2021 Northeast 110
Jan 9, 2021 Northeast 90
Jan 9, 2021 Midwest 55
Jan 9, 2021 West 80

我试过了:

SELECT "Date","Region",SUM("Sales") as "TotalUSD",
      SUM("Sales") * 100 / SUM(SUM("Sales"))  OVER () AS Percentage
FROM "sales_db"."sales_table"
GROUP BY "Date","Region"

但这并没有按日期按地区提供正确的百分比。我认为它可能会给出所有日期按地区划分的总数百分比。非常感谢任何帮助。

【问题讨论】:

  • 2021-01-01 和东北部的百分比是 48% 还是 ~25%?如果您也将所需的结果添加到问题中,那将是最好的。并标记您正在使用的 DBMS。
  • (1) 用您正在使用的数据库标记您的问题。 (2) 提供样本数据、期望的结果,并解释“没有给出正确的百分比”是什么意思。你想要什么结果?

标签: sql


【解决方案1】:

如果你想要一个日期内的比例,那么date应该在partition by中:

SELECT "Date", "Region", SUM("Sales") as "TotalUSD",
       SUM("Sales") * 100.0 / SUM(SUM("Sales"))  OVER (PARTITION BY "Date") AS Percentage
FROM "sales_db"."sales_table"
GROUP BY "Date", "Region";

注意:我强烈建议您去掉标识符名称中的双引号。如有必要,重新创建表。所有的双引号只会使查询更难编写和阅读。

另外,我添加了一个.0。有些数据库会做整数除法,这也会使结果有点偏离。

【讨论】:

    【解决方案2】:

    您必须使用partition by 子句,如下所示:

    SELECT "Date","Region",SUM("Sales") as "TotalUSD",
          SUM("Sales") * 100 / SUM(SUM("Sales"))  OVER (partition by "Region") AS Percentage
    FROM "sales_db"."sales_table"
    GROUP BY "Date","Region"
    

    【讨论】:

    • 嗯,这仍然不会产生预期的输出。也许我需要按“日期”分区?我正在尝试查看该日期每个地区的销售额百分比。
    【解决方案3】:

    您没有提到数据库或其版本。所以,下面是 SQL SERVER 2012 和 MYSQL 8.0 的代码

    CREATE TABLE MySales(Date DATETIME,Region Varchar(20),Sales Decimal(18,2));--Table Schema
    
    WITH CTE AS
        (SELECT Date,Region,Sales,SUM(Sales) OVER() TotalUSD,
               SUM(Sales)  OVER (partition by Region,Date ) AS TotalSumOfGroup
        FROM MySales
        )
        SELECT *,((Sales/TotalSumOfGroup)*100) Parcentage FROM CTE
        ORDER BY Region
    

    注意:请检查MySQL Code in DB Fiddle链接与您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      相关资源
      最近更新 更多