mysql - 查询返回每个产品名称及其到期、支付、取消和退款金额
问题描述
给出了三个表来获取产品详细信息,例如product_name、due_amount、paid_amount、canceled、refunded。三个表及其架构:
产品
列名 | 列类型 | 键/NULL |
---|---|---|
ID | 整数 | PK |
库存单位 | varchar(32) | |
产品名称 | varchar(128) | |
产品描述 | 文本 | |
时价 | 十进制(8,2) | |
qty_in_stock | 整数 |
发票
列名 | 列类型 | 键/NULL |
---|---|---|
ID | 整数 | PK |
发票号码 | 整数 | |
客户ID | 整数 | |
user_account_id | 整数 | |
总价 | 十进制(8,2) | |
time_issued | varchar | ñ |
time_due | varchar | ñ |
time_paid | varchar | ñ |
time_cancelled | varchar | ñ |
time_refunded | varchar | ñ |
发票项目
列名 | 列类型 | 键/NULL |
---|---|---|
ID | 整数 | PK |
invoice_id | 整数 | fk |
product_id | 整数 | fk |
数量 | 整数 | fk |
价格 | 十进制(8,2) | |
line_total_price | 十进制(8,2) |
我试过这样:
SELECT Distinct product, amount_due,amount_paid,cancelled_prod,refund_prod
FROM (SELECT p.product_name AS product,
((p.current_price * ii.quantity) - (ii.quantity * ii.price)) AS amount_due,
( ii.quantity * ii.price ) AS amount_paid,
'N/A' AS Cancelled_prod,
'N/A' AS refund_prod
FROM product p
INNER JOIN invoice_item ii
ON p.id = ii.product_id
INNER JOIN invoice i
ON i.id = ii.invoice_id
WHERE i.time_due IS NOT NULL
UNION
SELECT p.product_name AS product,
0 AS amount_due,
( ii.quantity * ii.price ) AS amount_paid,
'N/A' AS Cancelled_prod,
'N/A' AS refund_prod
FROM product p
INNER JOIN invoice_item ii
ON p.id = ii.product_id
INNER JOIN invoice i
ON i.id = ii.invoice_id
WHERE i.time_paid IS NOT NULL
UNION
SELECT p.product_name AS product,
0 AS amount_due,
0 AS amount_paid,
'cancelled' AS Cancelled_prod,
'N/A' AS refund_prod
FROM product p
INNER JOIN invoice_item ii
ON p.id = ii.product_id
INNER JOIN invoice i
ON i.id = ii.invoice_id
WHERE i.time_cancelled IS NOT NULL
UNION
SELECT p.product_name AS product,
0 AS amount_due,
0 AS amount_paid,
'N/A' AS Cancelled_prod,
'refunded' AS refund_prod
FROM product p
INNER JOIN invoice_item ii
ON p.id = ii.product_id
INNER JOIN invoice i
ON i.id = ii.invoice_id
WHERE i.time_refunded IS NOT NULL
) Z
ORDER BY product ASC
Is there a better way to do and also i am not sure whether the query will give correct result?
解决方案
select product_name, sum(amount_due), sum(amount_paid), sum(amount_cancelled), sum(amount_refunded)
from (
select product_name,
case when time_due is not null then line_total_price end amount_due,
case when time_paid is not null then line_total_price end amount_paid,
case when time_cancelled is not null then line_total_price end amount_cancelled,
case when time_refunded is not null then line_total_price end amount_refunded
from product a left join invoice_item c on a.id = c.product_id
left join invoice b on b.id = c.invoice_id
) temp_table
group by product_name order by product_name
推荐阅读
- python - 多维 Numpy ndarray 到 csv 或 pandas df
- php - 函数不会在 - if else - 语句内运行两次
- node.js - 在while循环NODEJS中停止异步进程
- powershell - 是否有 Powershell 命令来返回防火墙的运行固件版本?
- r - 我怎样才能只追踪一次?
- testing - 是否可以使用 ansible playbook 禁用保险库?
- python - 试图理解 tkinter 中的多线程
- http - 如何在 HTTPS 网页中显示 HTTP 内容
- pandas - 从 unix 框中读取 .zip 文件后如何返回 Pandas 数据框
- reactjs - 如何将 MockedProvider 用于与 compose HOC 一起使用的依赖查询?