Sqlite 查询聚合
Sqlite query aggregating
我希望使用 Sqlite3 解决以下问题。我想汇总这些数据:
+--------+-------+----------+----------+--------+
| DRAWID | BETID | TICKETID | STATUS | AMOUNT |
+--------+-------+----------+----------+--------+
| 1 | 1 | 1 | OK | 3 |
| 1 | 2 | 1 | OK | 2 |
| 1 | 3 | 2 | CANCELED | 4 |
| 1 | 4 | 2 | CANCELED | 7 |
| 1 | 5 | 3 | OK | 5 |
| 1 | 6 | 3 | OK | 4 |
+--------+-------+----------+----------+--------+
给以下
+--------+-----------+-----------+--------------+----------+-------------+
| BetsOK | BetsNotOk | TicketsOk | TicketsNotOk | AmountOk | AmountNotOk |
+--------+-----------+-----------+--------------+----------+-------------+
| 4 | 2 | 2 | 1 | 14 | 11 |
+--------+-----------+-----------+--------------+----------+-------------+
为了获得 TicketsOk 的正确分组,我似乎需要执行两个子查询并且必须加入。一个用于 Ok 的子查询和另一个用于 NotOk 的子查询
(SELECT drawId, (DISTINCT ticketId) FROM Bets WHERE drawId = AND userId = AND Status IN ("OK")) TblTicketsOk ...
在 sqlite3 或一般 sql 中是否存在可能更简单的东西。有人可以帮忙写完整的 sql 语句来解决这个问题吗?
你不需要使用join
,尝试在COUNT
函数中使用distinct
和CASE WHEN
。
SELECT COUNT(distinct(CASE WHEN STATUS = 'OK' then BETID end)) BetsOK,
COUNT(distinct(CASE WHEN STATUS = 'CANCELED' then BETID end)) BetsNotOk,
COUNT(distinct(CASE WHEN STATUS = 'OK' then TICKETID end)) TicketsOk,
COUNT(distinct(CASE WHEN STATUS = 'CANCELED' then TICKETID end)) TicketsNotOk,
SUM(CASE WHEN STATUS = 'OK' then AMOUNT else 0 end) AmountOk,
SUM(CASE WHEN STATUS = 'CANCELED' then AMOUNT else 0 end) AmountNotOk
FROM T
[结果]:
| BetsOK | BetsNotOk | TicketsOk | TicketsNotOk | AmountOk | AmountNotOk |
|--------|-----------|-----------|--------------|----------|-------------|
| 4 | 2 | 2 | 1 | 14 | 11 |
我希望使用 Sqlite3 解决以下问题。我想汇总这些数据:
+--------+-------+----------+----------+--------+
| DRAWID | BETID | TICKETID | STATUS | AMOUNT |
+--------+-------+----------+----------+--------+
| 1 | 1 | 1 | OK | 3 |
| 1 | 2 | 1 | OK | 2 |
| 1 | 3 | 2 | CANCELED | 4 |
| 1 | 4 | 2 | CANCELED | 7 |
| 1 | 5 | 3 | OK | 5 |
| 1 | 6 | 3 | OK | 4 |
+--------+-------+----------+----------+--------+
给以下
+--------+-----------+-----------+--------------+----------+-------------+
| BetsOK | BetsNotOk | TicketsOk | TicketsNotOk | AmountOk | AmountNotOk |
+--------+-----------+-----------+--------------+----------+-------------+
| 4 | 2 | 2 | 1 | 14 | 11 |
+--------+-----------+-----------+--------------+----------+-------------+
为了获得 TicketsOk 的正确分组,我似乎需要执行两个子查询并且必须加入。一个用于 Ok 的子查询和另一个用于 NotOk 的子查询
(SELECT drawId, (DISTINCT ticketId) FROM Bets WHERE drawId = AND userId = AND Status IN ("OK")) TblTicketsOk ...
在 sqlite3 或一般 sql 中是否存在可能更简单的东西。有人可以帮忙写完整的 sql 语句来解决这个问题吗?
你不需要使用join
,尝试在COUNT
函数中使用distinct
和CASE WHEN
。
SELECT COUNT(distinct(CASE WHEN STATUS = 'OK' then BETID end)) BetsOK,
COUNT(distinct(CASE WHEN STATUS = 'CANCELED' then BETID end)) BetsNotOk,
COUNT(distinct(CASE WHEN STATUS = 'OK' then TICKETID end)) TicketsOk,
COUNT(distinct(CASE WHEN STATUS = 'CANCELED' then TICKETID end)) TicketsNotOk,
SUM(CASE WHEN STATUS = 'OK' then AMOUNT else 0 end) AmountOk,
SUM(CASE WHEN STATUS = 'CANCELED' then AMOUNT else 0 end) AmountNotOk
FROM T
[结果]:
| BetsOK | BetsNotOk | TicketsOk | TicketsNotOk | AmountOk | AmountNotOk |
|--------|-----------|-----------|--------------|----------|-------------|
| 4 | 2 | 2 | 1 | 14 | 11 |