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)
我做了一个包含 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)