Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不同日期条件对同一列求和的SQL语句_Sql - Fatal编程技术网

使用不同日期条件对同一列求和的SQL语句

使用不同日期条件对同一列求和的SQL语句,sql,Sql,我使用一个表格,试图从同一列中计算出两个独立年份的总支出 基本上,我有一份客户名单,我试图统计他们2018年和2019年的支出。我尝试了一些不同的方法,但我似乎无法让“case-when”功能发挥作用,因为一旦满足2018年的支出条件并填充了该值,2019年的金额就不会增加,反之亦然,所以我得到了2018年或2019年的总金额,但没有客户显示这两个方面的支出 这是我的疑问: select * from (select buyer_first_name, buyer_

我使用一个表格,试图从同一列中计算出两个独立年份的总支出

基本上,我有一份客户名单,我试图统计他们2018年和2019年的支出。我尝试了一些不同的方法,但我似乎无法让“case-when”功能发挥作用,因为一旦满足2018年的支出条件并填充了该值,2019年的金额就不会增加,反之亦然,所以我得到了2018年或2019年的总金额,但没有客户显示这两个方面的支出

这是我的疑问:

select * 
from
    (select 
         buyer_first_name, buyer_last_name, buyer_address_1, buyer_address_2,
         buyer_address_city, buyer_address_state, buyer_address_zip, buyer_email, buyer_phone_1,
         sum(case when sale_amount > 0 and year(sale_date) = 2018 then sale_amount end) as Spend18,
         sum(case when sale_amount > 0 and year(sale_date) = 2019 then sale_amount end) as Spend19
     from 
         database.table
     where 
         sale_date between date '2018-01-01' and date '2019-10-30'
     group by 
         buyer_first_name, buyer_last_name, buyer_address_1, buyer_address_2,
         buyer_address_city, buyer_address_state, buyer_address_zip, buyer_email, buyer_phone_1)


知道我做错了什么吗?谢谢大家!

奇怪的是,你为什么会有这样的问题,这真的需要研究。坦率地说,我希望得到和你一样的结果。但是,您可以通过这样做绕过此问题(假设您使用的是mysql):

如果所有销售额>=0,则可以跳过销售金额的正条件

如果这不起作用,请在不分组的情况下测试选择并查看发生了什么:

select sale_amount * if(sale_amount > 0 and year(sale_date) = 2018, 1, 0) as spend18,
       sale_amount * if(sale_amount > 0 and year(sale_date) = 2019, 1, 0) as spend19
from your_table;

我真的怀疑你的问题是SQL语法还是bug。您的查询看起来应该执行您想要的操作

问题是这些字段在两年内对任何客户都不相同。试着这样做:

select buyer_last_name
       sum(case when sale_amount > 0 and year(sale_date) = 2018 then sale_amount end) as Spend18,
       sum(case when sale_amount > 0 and year(sale_date) = 2019 then sale_amount end) as Spend19
from database.table
where sale_date between date '2018-01-01' and date '2019-10-30'
group by buyer_last_name;
我推测姓氏不太可能改变。如果这样做有效,您可以开始重新添加列,以查看问题列的位置


这就是数据库规范化的原因。重复的数据往往不同步。

我认为您正在寻找子选择。将case和where条件分离到它们自己的select语句中,然后选择该语句。请参阅此处了解更多信息,也称为子查询顺便说一句,如果满足并计算了Spend18条件,那么对于同一客户,您在Spend19下得到的值是多少?Anatoliy:在这种情况下,我只得到Spend19的NULL。这似乎给了我同样的问题——我在Spend18中为一些客户提供了值,在Spend19中为一些客户提供了值,这很奇怪,你需要在不分组的情况下进行选择,看看是否填充了数据,我编辑了答案,查看我的上一个查询感谢你的帮助。就是这样!!谢谢大家!@卡罗琳。如果这解决了你的问题,你可以考虑接受答案。
select buyer_last_name
       sum(case when sale_amount > 0 and year(sale_date) = 2018 then sale_amount end) as Spend18,
       sum(case when sale_amount > 0 and year(sale_date) = 2019 then sale_amount end) as Spend19
from database.table
where sale_date between date '2018-01-01' and date '2019-10-30'
group by buyer_last_name;