以下是问题和数据库信息。
使用UNION命令为客户'C001'准备一份完整的声明 - 它应按如下方式布置。 (请注意,下面显示的值不正确。)您可以使用''或NULL作为空值 - 如有必要,使用0。
以下是指向包含数据库信息的网页的链接。 http://sqlzoo.net/5_0.htm或查看下图。
以下是我的尝试:
SELECT sdate AS LineDate, "delivery" AS LEGEND, price*quantity AS Total,"" AS Amount
FROM shipped
JOIN product ON (shipped.product=product.id)
WHERE badguy='C001'
UNION
SELECT rdate,notes, "",receipt.amount
FROM receipt
WHERE badguy='C001'
以下是我的回复:
错误的答案。正确的答案有5行。
金额列中的金额似乎不正确,我无法弄清楚如何按日期订购数据,因为它使用两个不同的日期列(sdate和rdate是UNIONED)。
答案 0 :(得分:1)
看起来示例中的数据是使用group by
按日期和费用类型聚合的,这就是为什么你会得到太多行。
此外,您可以按列的别名(LineDate
)进行排序,order by
子句将应用于union
中的所有行。
SELECT sdate AS LineDate, "delivery" AS LEGEND, SUM(price*quantity) AS Total,"" AS Amount
FROM shipped
JOIN product ON (shipped.product=product.id)
WHERE badguy='C001'
GROUP BY sdate
UNION
SELECT rdate, notes, "",receipt.amount
FROM receipt
WHERE badguy='C001'
ORDER BY LineDate
答案 1 :(得分:0)
分别开发联合的每个部分通常最容易。注意使用“null”来分隔货币列。第一个选择命名列。
select s.sdate as tr_date, 'Delivery' as type, sum((s.quantity * p.price)) as extended_price, null as amount
from shipped s
inner join product p on p.id = s.product
where badguy = 'C001'
group by s.sdate
union all
select rdate, notes, null, sum(amount)
from receipt
where badguy = 'C001'
group by rdate, notes
order by tr_date