SQL 相似行的乘法值

问题描述 投票:0回答:2

我有一张桌子

姓名 开始日期 结束日期 代码 价值
姓名1 2024年11月12日 2024年11月12日 A 0.5
姓名1 2024年11月12日 2024年11月12日 B 0.6
姓名1 2024年11月12日 2024年11月12日 C 0.7
姓名1 2024年11月12日 2024年11月12日 D 0.7
姓名2 2024年11月12日 2024年11月12日 A 0.6
姓名2 2024 年 12 月 11 日 2024年11月12日 B 0.3
姓名3 2024年11月12日 2024 年 12 月 11 日 A 0.2

我需要做的是编写一个查询,该查询将返回以下值:

  • 相同姓名、开始日期、结束日期
  • 仅适用于具有全部 3 个代码的名称,即 A、B 和 C
  • 该值将是 AxBxC 的乘积

因此,这种情况下的预期结果只有一行,因为只有 Name1 获得了所有 3 个代码(A、B、C),并且值为 0.5 x 0.6 x 0.7。

姓名 开始日期 结束日期 代码 价值
姓名1 2024年11月12日 2024年11月12日 X 0.21

我知道我可以使用 exp(sum(log(x))) 结合 Over 和 Partition By 进行乘法运算,但如何确保仅对具有所有 3 个代码的记录计算乘法运算?还有其他代码不会用于此计算,因此仅检查代码数量是行不通的。

sql sql-server
2个回答
0
投票

你可以试试这个

SELECT a.Name,a.[Date start],a.[Date end],'X' as code,a.val as Value FROM (SEELCT Name,[Date start],[Date end],GROUP_CONCAT(Code separator '') as code,EXP(SUM(LOG(Value))) as val GROUP BY Name) as a WHERE a.code ='ABC'


0
投票

您可以使用 STRING_AGG 来执行此操作:

SELECT 
  Name,
  Date_start,
  Date_end,
  STRING_AGG(Code,',') WITHIN GROUP (ORDER BY Code) as Code,
  SUM(Value) as Value
FROM mytable
WHERE Code in ('A','B','C')
GROUP BY Name, Date_start, Date_end
HAVING STRING_AGG(Code,',') WITHIN GROUP (ORDER BY Code) = 'A,B,C'
ORDER BY Name, Date_start, Date_end
;

结果:

姓名 开始日期 日期_结束 代码 价值
姓名1 2024-11-12 2024-11-12 A、B、C 1.8

参见:DBFIDDLE

© www.soinside.com 2019 - 2024. All rights reserved.