SQL:使用UNION

问题描述:

以下是问题和数据库信息。SQL:使用UNION

使用UNION命令为客户'C001'准备一个完整的陈述 - 它应按如下方式进行布局。 (请注意,下面所示的值是不正确的。)您可以使用“”或NULL为空值 - 如果需要使用0.1 enter image description here

这里是与数据库信息的网页的链接。 http://sqlzoo.net/5_0.htm或看到下面的图片。 enter image description here

这是我曾尝试:

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这被合并了如何通过日期对数据进行排序)。

+1

功课喜欢功课......是吗?如果是这样,请标记为这样。 – 2012-03-16 23:30:44

+1

@JoachimIsaksson:它来自一个在线SQL教程 - 请参阅http://sqlzoo.net/5.htm - 所以我怀疑它是作业。相反,这是版权侵犯。 :-P – ruakh 2012-03-16 23:35:00

+0

如果您发布了CREATE TABLE和INSERT语句,您可能会获得更多帮助。 – 2012-03-16 23:37:10

看起来像示例中的数据正在使用日期和收费类型使用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 
+0

实际上你甚至不需要order by子句;我几分钟前试过这个,它只需要group-by子句。结果并不是按日期顺序排列的,但它并不在乎。 (我怀疑你应该在工会的第二个分支中使用group-by,尽管没有行可以区分它的存在和缺席,所以我不能肯定地说)。 – ruakh 2012-03-16 23:39:00

+0

你不需要在第二个'select'选择组,因为你想获得所有收据。 – Diego 2012-03-16 23:41:50

+0

你怎么知道?在我看来,如果您想按日期对所有交付进行分组,那么您还需要按类型和日期对所有收款进行分组。 – ruakh 2012-03-16 23:43:33

通常分开开发联合的每个部分通常是最容易的。注意使用“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