2012-03-16 79 views
0

以下是問題和數據庫信息。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

回答

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 
+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

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