2017-04-18 88 views
0

我做了有3個表的查詢:1當年,去年和名稱的國家 enter image description hereSQL使2種不同的日期類型在一個查詢

的正如你可以看到當年和最後的結果一年是一樣的,這是這裏的問題。我想用喜歡。我想用一個當前年份和去年一個查詢進行查詢。

我可以用這個去年YEAR(o.date_add) = YEAR(NOW() - INTERVAL 1 YEAR)

而且從目前的一年,我可以用這個例子:YEAR(o.date_add) = YEAR(CURRENT_DATE())

我的查詢:

SELECT 
    IFNULL(SUM(DISTINCT o.total_paid_tax_excl), 0) AS CurrentYEAR, 
    IFNULL(SUM(DISTINCT o.total_paid_tax_excl), 0) AS LastYEAR, 
    IFNULL(CONCAT(l.name), 0) AS name 
FROM 
    expoled.ps_orders o 
     LEFT JOIN 
    expoled.ps_address a ON o.id_address_delivery = a.id_address 
     INNER JOIN 
    expoled.ps_country c ON a.id_country = c.id_country 
     INNER JOIN 
    expoled.ps_country_lang l ON c.id_country = l.id_country 
WHERE 
    l.id_lang = 7 
     AND o.current_state IN (3 , 4, 5, 9, 13, 15, 20, 22, 23, 24, 25, 121) 
     AND l.name NOT IN ('Netherlands') 
GROUP BY (l.name) 

我可以做,但我想單獨查詢它在1查詢我怎麼能​​這個? 我嘗試過聯盟,但結果保持不變。

我想有像這樣(這一個不工作!只是舉例[Photoshop中] ddd


我想我需要更改查詢的這部分

SELECT 
    IFNULL(SUM(o.total_paid_tax_excl), 0) AS CurrentYEAR, 
    IFNULL(SUM(o.total_paid_tax_excl), 0) AS LastYEAR, 
    IFNULL(CONCAT(l.name), 0) AS name 
FROM 

這添加到我的查詢

對於CurrentYEAR = YEAR(o.date_add) = YEAR(CURRENT_DATE())

對於LastYEAR = YEAR(o.date_add) = YEAR(NOW() - INTERVAL 1 YEAR)

回答

0

可以使用sum()聚合函數內的條件表達式(if()功能或case語句)添加只有那些符合標準值:

SELECT 
    IFNULL(SUM(DISTINCT if(YEAR(o.date_add) = YEAR(CURRENT_DATE()),o.total_paid_tax_excl, 0)), 0) AS CurrentYEAR, 
    IFNULL(SUM(DISTINCT if(YEAR(o.date_add) = YEAR(CURRENT_DATE())-1,o.total_paid_tax_excl, 0)), 0) AS LastYEAR, 
    IFNULL(l.name, '') AS name 
FROM 
    expoled.ps_orders o 
     LEFT JOIN 
    expoled.ps_address a ON o.id_address_delivery = a.id_address 
     INNER JOIN 
    expoled.ps_country c ON a.id_country = c.id_country 
     INNER JOIN 
    expoled.ps_country_lang l ON c.id_country = l.id_country 
WHERE 
    l.id_lang = 7 
     AND o.current_state IN (3 , 4, 5, 9, 13, 15, 20, 22, 23, 24, 25, 121) 
     AND l.name NOT IN ('Netherlands') 
GROUP BY IFNULL(l.name, '') 

我還簡化了表達爲名稱字段,並使group by子句與它一致。

我沒有更改查詢的任何其他部分,但我並不完全同意sum()中的distinct,因爲您可以使用與納稅相同的價值,但這是您的數據。

如果您的表的數據比前一年的數據要舊,那麼請考慮添加where條件來限制運行計算的記錄。

+0

感謝隊友,我也同意了不同的部分,會做稍後有些事。乾杯 – Deniz

1

我想你可以嘗試這樣的事情(我加CASE與SUM場和一個WHERE條件只提取相關年份):

SELECT 
    IFNULL(SUM( CASE WHEN YEAR(CURRENT_DATE)-YEAR(o.date_date) =0 THEN o.total_paid_tax_excl ELSE 0 END), 0) AS CurrentYEAR, 
    IFNULL(SUM(CASE WHEN YEAR(CURRENT_DATE)-YEAR(o.date_date) =1 THEN o.total_paid_tax_excl ELSE 0 END), 0) AS LastYEAR, 
    IFNULL(CONCAT(l.name), 0) AS name 
FROM 
    expoled.ps_orders o 
     LEFT JOIN 
    expoled.ps_address a ON o.id_address_delivery = a.id_address 
     INNER JOIN 
    expoled.ps_country c ON a.id_country = c.id_country 
     INNER JOIN 
    expoled.ps_country_lang l ON c.id_country = l.id_country 
WHERE 
    l.id_lang = 7 
     AND o.current_state IN (3 , 4, 5, 9, 13, 15, 20, 22, 23, 24, 25, 121) 
     AND l.name NOT IN ('Netherlands') 
     AND YEAR(o.date_date) IN (YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE)-1) 
GROUP BY (l.name)