【发布时间】:2022-01-17 11:17:42
【问题描述】:
我有下表。使用sqliteDB
| Item | Result |
|---|---|
| A | Pass |
| B | Pass |
| A | Fail |
| B | Fail |
我想使用一些查询来实现上表如下。
| Item | Total | Accept | Reject |
|---|---|---|---|
| A | 2 | 1(50%) | 1(50%) |
| B | 2 | 1(50%) | 1(50%) |
我应该如何构造这个查询?
【问题讨论】:
-
请标记您正在使用的 DBMS。
我有下表。使用sqliteDB
| Item | Result |
|---|---|
| A | Pass |
| B | Pass |
| A | Fail |
| B | Fail |
我想使用一些查询来实现上表如下。
| Item | Total | Accept | Reject |
|---|---|---|---|
| A | 2 | 1(50%) | 1(50%) |
| B | 2 | 1(50%) | 1(50%) |
我应该如何构造这个查询?
【问题讨论】:
如果您的 DBMS 支持,您可以尝试PIVOT()。然后根据 DMBS 使用 CONCAT 或 || 运算符。
查询:
SELECT
item,
total,
SUM(Pass)||'('|| CAST((SUM(Pass)*1.0/total*1.0)*100.0 AS DECIMAL)||'%)' AS Accept,
SUM(Fail)||'('|| CAST((SUM(Fail)*1.0/total*1.0)*100.0 AS DECIMAL)||'%)' AS Reject
FROM
(
SELECT
Item,
result,
COUNT(result) OVER(PARTITION BY item ORDER BY result ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS total,
CASE
WHEN Result = 'Pass' then 1
ELSE 0
END AS Pass,
CASE
WHEN Result = 'Fail' then 1
ELSE 0
END AS Fail
FROM t
) AS j
GROUP BY item, total
查询说明:
SQLITE 不处理PIVOT,我们正在使用CASE 语句手动创建标志Pass 和Failtotal,这里使用COUNT作为解析函数。它基本上是计算计数并将其放置在所有行中的快捷方式|| 作为连接运算符来连接结果与总和和其中的百分比【讨论】:
ROUND 将有助于处理小数位。已用解释更新了答案。 HTH!