SQL 在一次查询中创建 2 种不同的日期类型

SQL make 2 different date types in one query

我做了一个包含 3 个表的查询:1 个包含当年、去年和国家名称

如您所见,今年和去年的结果是一样的,这就是问题所在。我想用像。我想用当前年份的查询和去年的查询进行 1 个查询。

去年我可以用这个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 个查询中使用它,我该如何归档呢? 我确实尝试过 Union,但结果保持不变。

我想要这样的(这个不行!!举个例子[photoshop]


我想我需要更改这部分查询

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

并将其添加到我的查询中

当前年份 = YEAR(o.date_add) = YEAR(CURRENT_DATE())

去年 = YEAR(o.date_add) = YEAR(NOW() - INTERVAL 1 YEAR)

您可以在 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,因为您可以支付与税收相同的价值,但它是你的数据。

如果您的 table 的数据比前一年的数据旧,则考虑添加一个 where 条件来限制计算为 运行.

的记录

我认为您可以尝试这样的操作(我为具有 SUM 的字段添加了 CASE 和 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)