我有一张桌子
姓名 | 开始日期 | 结束日期 | 代码 | 价值 |
---|---|---|---|---|
姓名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 |
我需要做的是编写一个查询,该查询将返回以下值:
因此,这种情况下的预期结果只有一行,因为只有 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 个代码的记录计算乘法运算?还有其他代码不会用于此计算,因此仅检查代码数量是行不通的。
你可以试试这个
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'
您可以使用 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