在分析这个问题时,我们需要计算满足特定条件的支付用户数和支付总金额。具体条件是城市名称为 "Dubai" 且支付金额大于 60。我们来分析每个选项:
A:
```sql
select count(用户ID) as 支付用户数, sum(支付金额) as 支付总金额 from pay_fact where 城市 = "Dubai" and 支付金额 > 60;
```
- 这个选项计算了满足条件的记录数和支付总金额,但没有去重用户ID,因此支付用户数可能会重复统计同一用户的多笔支付。
B:
```sql
select count(distinct 用户ID) as 支付用户数, sum(支付金额) as 支付总金额 from pay_fact where 城市 = "Dubai" and 支付金额 > 60;
```
- 这个选项正确地使用了 `count(distinct 用户ID)` 来统计不同的支付用户数,并计算了支付总金额。满足题目要求。
C:
```sql
select count(用户ID) as 支付用户数, sum(支付金额) as 支付总金额 from pay_fact having 城市 = "Dubai" and 支付金额 > 60;
```
- 这个选项错误地使用了 `having` 子句,而没有 `group by`,导致语法错误。`having` 通常用于过滤聚合后的结果集。
D:
```sql
select count(distinct 用户ID) as 支付用户数, sum(支付金额) as 支付总金额 from pay_fact where 支付金额 > 60 group by 城市 having 城市 = "Dubai";
```
- 这个选项在逻辑上是正确的,因为它先过滤支付金额大于60的记录,然后按城市分组,并使用 `having` 过滤城市为 "Dubai" 的结果。同时,使用 `count(distinct 用户ID)` 统计不同用户。
正确答案是 B 和 D。B 直接在 `where` 子句中使用条件过滤,而 D 使用 `group by` 和 `having` 达到同样的效果。两者都正确计算了不同的支付用户数和支付总金额。