sql - 如何通过小计算从现有表创建新的 sql 表
问题描述
我有一个这样的 SQLite 表:
ID | 物品 | 总消耗 | 共享ppl | 由...支付 | 第二 | 第三 |
---|---|---|---|---|---|---|
1 | 午餐 | 150 | 3 | 汤姆 | 杰克 | 哈利 |
2 | 晚餐 | 200 | 2 | 杰克 | 哈利 | |
3 | 饮料 | 75 | 3 | 哈利 | 杰克 | 汤姆 |
我想要一个新的 SQLite 表来显示每个人的份额。它需要进行计算以在人们之间分配每个项目的成本。
物品 | 汤姆 | 杰克 | 哈利 |
---|---|---|---|
午餐 | 50 | 50 | 50 |
晚餐 | 0 | 100 | 100 |
饮料 | 25 | 25 | 25 |
请告知我需要在 sql 上运行什么查询才能获得这个新表。
解决方案
一种方法,使用 unpivot 后跟枢轴和聚合:
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;
旁注:您当前的表格设计未正确规范化。您可以并且应该在此处将其更改为您想要的输出。
推荐阅读
- android - 来自 Firebase 云消息传递的通知未显示在设备上
- android - Lottie 文件变形
- python - 如何处理具有多个输出的神经网络的损失函数和对数概率?
- mysql - 为什么 IS NOT NULL 语句返回所有内容
- arrays - 展平 simd_float4x4 矩阵的优雅方法
- cocoa - CAOpenGLLayer 到图像
- python-2.7 - 是否可以在另一个三元运算符中使用三元运算符?
- kubernetes - 如何在 kubernetes 上设置基本的 rabbitmq
- java - 我如何加载 3d 模型并获取点的模型?
- c# - 无法访问连接字符串