SQL:使用UNION

时间:2012-03-16 23:26:43

标签: sql sql-order-by union

以下是问题和数据库信息。

使用UNION命令为客户'C001'准备一份完整的声明 - 它应按如下方式布置。 (请注意,下面显示的值不正确。)您可以使用''或NULL作为空值 - 如有必要,使用0。 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行。

enter image description here

金额列中的金额似乎不正确,我无法弄清楚如何按日期订购数据,因为它使用两个不同的日期列(sdate和rdate是UNIONED)。

2 个答案:

答案 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