2014-12-07 54 views
0

我有兩個不同的表:第一個表是用來發送針對誰聲稱他們的產品按日期連接兩個表的順序和0值設置爲空欄

+---+-----------+----------+--------+ 
    |id | claimed | date | ref no | 
    +---+-----------+----------+--------+ 
    | 1 | 20  | 20-02-13 | sda123 | 
    | 2 | 30  | 22-02-13 | sda123 | 
    | 3 | 40  | 24-02-13 | sda123 | 
    | 4 | 50  | 26-02-13 | sda123 | 
    +---+-----------+----------+--------+ 

而第二個表是用戶數據用於爲添加產品的用戶保存數據。

+---+-----------+----------+--------+ 
    |id | added | date | ref no | 
    +---+-----------+----------+--------+ 
    | 1 | 15  | 21-02-13 | sda123 | 
    | 2 | 25  | 23-02-13 | sda123 | 
    | 3 | 35  | 25-02-13 | sda123 | 
    | 4 | 45  | 27-02-13 | sda123 | 
    +---+-----------+----------+--------+ 

現在我想加入這兩張表。但我想根據日期加入他們。如果在提到的日期用戶只添加了產品,那麼在聲明的列中將被設置爲0,並且可以設置爲verca。

走勢sda123

+-----------+----------+------------+ 
    | claimed | added | date | 
    +-----------+----------+------------+ 
    | 20  |  0 | 20-02-13 | 
    | 0  | 15 | 21-02-13 | 
    | 30  |  0 | 22-02-13 | 
    | 0  | 25 | 23-02-13 | 
    +-----------+----------+------------+ 

任何人可以幫助我如何在SQL這樣做嗎?提前致謝。

+0

其實它是。但現在我手動使用它。 – 2014-12-07 05:32:02

+0

是的,它顯示2013-02-20在真正的表格。但是因爲如果我在這裏寫它太長,我編輯它。 – 2014-12-07 05:33:56

+0

不,它沒有任何意義。它與行的數量一樣。 – 2014-12-07 05:35:31

回答

0

您選擇的所有日期的工會,然後用兩個表加入它,以獲得求和:

SELECT COALESCE(SUM(`claimed`), 0) `claimed`, COALESCE(SUM(`added`),0) `added`, `date` 
FROM (SELECT `date` FROM `claimed` UNION SELECT `date` FROM `added`) `dates` 
LEFT JOIN `claimed` USING (`date`) 
LEFT JOIN `added` USING (`date`) 
GROUP BY `date` 
ORDER BY `date`; 

我使用COALESCE()防止NULL從顯示的結果中;相反,它將顯示0(如果來自任一表的相應值在該特定日期不存在)。您可以使用IFNULL()而不是COALESCE(),因爲只有一個值需要評估。

Demo

+0

Jack,如何在結果中將0改成'dash'('-')? – 2014-12-10 17:35:30

0

使用LEFT JOIN和用零替換的NULL,就像這樣:

SELECT CLAIMED.claimed, IFNULL(ADDED.added, 0), CLAIMED.date 
FROM CLAIMED JOIN ADDED ON CLAIMED.date=ADDED.date 

我用蓋帽爲表名,因爲你沒有指定它們。