如何通过少量计算从现有 table 创建新的 sql table
How to create a new sql table from existing table with small calculations
我有一个像这样的 SQLite table:
id
项目
总成本
sharedppl
支付方
秒
第三
1
午餐
150
3
汤姆
杰克
哈利
2
晚餐
200
2
杰克
哈利
3
饮料
75
3
哈利
杰克
汤姆
我想要一个新的 SQLite table 来显示每个人的份额。它需要进行计算以在人们之间分摊每件物品的成本。
项目
汤姆
杰克
哈利
午餐
50
50
50
晚餐
0
100
100
饮料
25
25
25
请告知我在 sql 上 运行 需要什么查询才能获得这个新的 table。
一种方法,先使用反透视,然后使用透视和聚合:
WITH cte AS (
SELECT item, totalcost, paidby AS person FROM yourTable
UNION ALL
SELECT item, totalcost, second FROM yourTable
UNION ALL
SELECT item, totalcost, third FROM yourTable
)
SELECT
item,
CASE WHEN COUNT(CASE WHEN person = 'Tom' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Tom,
CASE WHEN COUNT(CASE WHEN person = 'Jack' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Jack,
CASE WHEN COUNT(CASE WHEN person = 'Harry' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Harry
FROM cte
GROUP BY item, id
ORDER BY id;
旁注:您当前的 table 设计未正确标准化。您可以并且应该在此处将其更改为您想要的输出。
使用 CASE
表达式计算每个人的份额:
SELECT item,
CASE WHEN 'Tom' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Tom,
CASE WHEN 'Jack' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Jack,
CASE WHEN 'Harry' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Harry
FROM tablename
参见demo。
我有一个像这样的 SQLite table:
id | 项目 | 总成本 | sharedppl | 支付方 | 秒 | 第三 |
---|---|---|---|---|---|---|
1 | 午餐 | 150 | 3 | 汤姆 | 杰克 | 哈利 |
2 | 晚餐 | 200 | 2 | 杰克 | 哈利 | |
3 | 饮料 | 75 | 3 | 哈利 | 杰克 | 汤姆 |
我想要一个新的 SQLite table 来显示每个人的份额。它需要进行计算以在人们之间分摊每件物品的成本。
项目 | 汤姆 | 杰克 | 哈利 |
---|---|---|---|
午餐 | 50 | 50 | 50 |
晚餐 | 0 | 100 | 100 |
饮料 | 25 | 25 | 25 |
请告知我在 sql 上 运行 需要什么查询才能获得这个新的 table。
一种方法,先使用反透视,然后使用透视和聚合:
WITH cte AS (
SELECT item, totalcost, paidby AS person FROM yourTable
UNION ALL
SELECT item, totalcost, second FROM yourTable
UNION ALL
SELECT item, totalcost, third FROM yourTable
)
SELECT
item,
CASE WHEN COUNT(CASE WHEN person = 'Tom' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Tom,
CASE WHEN COUNT(CASE WHEN person = 'Jack' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Jack,
CASE WHEN COUNT(CASE WHEN person = 'Harry' THEN 1 END) > 0
THEN MAX(totalcost) / COUNT(person) ELSE 0 END AS Harry
FROM cte
GROUP BY item, id
ORDER BY id;
旁注:您当前的 table 设计未正确标准化。您可以并且应该在此处将其更改为您想要的输出。
使用 CASE
表达式计算每个人的份额:
SELECT item,
CASE WHEN 'Tom' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Tom,
CASE WHEN 'Jack' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Jack,
CASE WHEN 'Harry' IN (paidby, second, third) THEN 1.0 * totalcost / sharedppl ELSE 0 END AS Harry
FROM tablename
参见demo。