如何通过少量计算从现有 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