按国家和条件索引计算 SQL 分区中的市场总和 [关闭]

Posted

技术标签:

【中文标题】按国家和条件索引计算 SQL 分区中的市场总和 [关闭]【英文标题】:Calculate sum of market in SQL partition by country and index with conditions [closed] 【发布时间】:2020-11-24 07:13:05 【问题描述】:

我有一个数据集,我必须在其中按国家/地区和索引计算 SQL Server 分区中的市场总和:

如果按国家/地区的索引仅为 1,则索引标记输出将为 0,如果按国家/地区的 index=>1,则将采用市场价值的总和,而不采用指数 1 的市场价值

要明确,如果指数值只有1,那么indexmark应该是0,如果指数是1并且大于1,那么它将取市场价值的总和,不包括指数1的市场价值

输入:

Country Index Market  
--------------------
India    1     100
US       1     200
UK       7     400
US       6     600
UK       3     800

输出:

Country Index Market  IndMark
----------------------------
India    1     100        0
US       1     200      600
UK       7     400     1200
US       6     600      600
UK       3     800     1200

我尝试过使用下面的 SQL 查询,但它没有给我预期的结果

SELECT 
    Country, Index, Market,
    SUM(Market) OVER (PARTITION BY Country, (Index > 1) AS IndMark
FROM 
    table

【问题讨论】:

我不懂逻辑,也看不懂问题,因为表格格式不正确。 mysql 还是 SQL Server?请只标记一个 RDBMS @TimBiegeleisen 现已格式化 图片没用。用他们的 CREATE TABLE + INSERT INTO 替换源数据。 if index is only 1 by country 你的意思是严格意义上的值是1,还是只有一个不同的index值(也可能不是1) 【参考方案1】:

带有SUM()窗口功能:

SELECT *,
       COALESCE(SUM(CASE WHEN [Index] > 1 THEN [Market] END) OVER (PARTITION BY [Country]), 0) [IndexMark] 
FROM tablename

请参阅demo。

【讨论】:

如果零/负 index 可能会失败,SUM(CASE WHEN [index]=1 THEN 0 ELSE 1 END) 之类的更可靠。如果 index is only 1 by country 表示“只有一个不同的值”,则必须使用 COUNT(DISTINCT index) = 1 如果零/负索引可能您在哪里看到零/负索引? 一如既往,OP 只讲述部分事实,并没有提供所有限制 - 所以我认为考虑所有可能的变体是有用的。

以上是关于按国家和条件索引计算 SQL 分区中的市场总和 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用于计算同一列的值百分比的 SQL [关闭]

按总和过度分区

从两个表计算分区并在bigquery中使用小于或等于索引的索引

oracle数据库约200W数据查询非常慢,查询需要10几秒,经常查询超时,这个正常吗?有没有啥好的办法解决

sql中的条件总和,根据字段中的条件从另一个表中获取正确的总和

SQL Server 数据分区管理