SQL:使用UNION
问题描述:
以下是问题和数据库信息。SQL:使用UNION
使用UNION命令为客户'C001'准备一个完整的陈述 - 它应按如下方式进行布局。 (请注意,下面所示的值是不正确的。)您可以使用“”或NULL为空值 - 如果需要使用0.1
这里是与数据库信息的网页的链接。 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这被合并了如何通过日期对数据进行排序)。
答
看起来像示例中的数据正在使用日期和收费类型使用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
答
通常分开开发联合的每个部分通常是最容易的。注意使用“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
功课喜欢功课......是吗?如果是这样,请标记为这样。 – 2012-03-16 23:30:44
@JoachimIsaksson:它来自一个在线SQL教程 - 请参阅http://sqlzoo.net/5.htm - 所以我怀疑它是作业。相反,这是版权侵犯。 :-P – ruakh 2012-03-16 23:35:00
如果您发布了CREATE TABLE和INSERT语句,您可能会获得更多帮助。 – 2012-03-16 23:37:10