Sql语句测试两列结果在一列不重复行

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

我一直在尝试解决如何在两个不同的行中测试条件,并将结果放入一个单列而不重复行。

我需要以选择团队名称的方式获得结果,比方说 Bruins,以防 Bruins 出现在 Team1 或 Team1 列中,稍后将该列 (TEAM_CASES) 用作过滤器或分组依据以查看事件是否完成。

我的数据是这样的:

活动 团队1 团队2 完成
鸭子与魔鬼 鸭子 恶魔 1
鸭子 vs 熊队 鸭子 棕熊队 1

我尝试在语法时使用这种情况,但它不起作用:

CASE 
WHEN Team1 = "Bruins" or Team2 = "Bruins" then Bruins
WHEN Team1 = "Devils" or Team2 = "Devils" then Devils
WHEN Team1 = "Ducks" or Team2 = "Ducks" then Ducks
ELSE "Other"
END TEAM_CASES

我得到的输出是这样的,完全忽略了鸭子的结果,当它应该是 2:

| Team   | TotalCompleted |
| ------ | -------------- |
| Bruins | 1              |
| Devils | 1              |
| Ducks  | 0              |

我注意到这种情况只检查记录直到满足第一个条件,之后它移动到第二个 secord

我还考虑过旋转 Teams1 和 Teams 2 列,但是当我意识到稍后我会遇到与以前相同的问题时,我正处于中间位置,因为数据最终会像我在下面发布的那样,我不会能够检查条件,因为将再次按行显示 2 个条件:

活动 是鸭子 是恶魔 isBruins 完成
鸭子与魔鬼 1 1 0 1
鸭子 vs 熊队 1 0 1 1

我把我想要的输出放在下面,但到目前为止,解决这个问题的每一次尝试都没有奏效。

期望的输出:

团队 完成
棕熊队 1
恶魔 1
鸭子 2

谢谢大家!

sql snowflake-cloud-data-platform unpivot lateral-join
2个回答
0
投票

可以使用 UNION ALL 来组合 bith teams 并用它来聚合

WITH CTE as(
SELECT Team1 as Team FROM mytable WHERE Completed = 1
UNION ALL
SELECT Team2 FROM mytable WHERE Completed = 1
)
SELELCT
Team,  COUNT(*) as TotalCompleted  
FROM CTE GROUP BY Team

0
投票

您正在寻找 unpivot 您的数据集(同时过滤已完成的游戏)。 Snowflake 支持 lateral joinsrow constructor

values()
所以我们可以在单表扫描中完成工作:

select x.team, count(*) completed 
from mytable t
cross join lateral ( values (t.team1), (t.team2) ) x(team)
where t.completed = 1
group by x.team
© www.soinside.com 2019 - 2024. All rights reserved.