2017-06-15 205 views
1

我是SQL Server 2012的新手,希望尽量减少Excel中的数据处理。在我的Excel中复制SUMIF的SQL函数

我有我的主要数据集,然后我想要从这些数据做SUMIF,并只返回sumif不等于零的行。

我使用下面的函数,它在不同的时间返回不同的结果。

可能的错误原因是有一些行的AccID为空。

, main_data2 as 
(

    select 
      md.* 

    from main_data md 
    left join 
    (
      select 
       AccID 
       ,sum(amount) as total_amount 
      from main_data 
      group by AccID 
      having sum(amount) <> 0 

) md2 on md.AccID = md2.AccID 

where md2.AccID is null 

) 
+0

我需要在最终结果中包含AccID为空的那些行。 – Isu

+0

现在你正在改变你的要求。你想只记录其账户有非零金额的记录,还是你想要所有记录?如果是后者,那么子查询有什么意义? –

回答

0

如果您想保留在最终结果集中所有帐户,然后LEFT JOIN似乎是适当的。您已经有的子查询会找到那些总数不为零的帐户。您可以将main_data加入此子查询,然后可以选择将每条记录标记为空,只要其对应的帐户金额为零。

SELECT 
    md.*, 
    CASE WHEN md2.AccID IS NULL THEN 'Empty' END AS label 
FROM main_data md 
LEFT JOIN 
(
    SELECT AccID, SUM(amount) AS total_amount 
    FROM main_data 
    GROUP BY AccID 
    HAVING SUM(amount) <> 0 
) md2 
    ON md.AccID = md2.AccID 
+0

我不需要我最终结果中的所有结果。只需要sumif余额不为零的账户和没有accountID的账户(所以我可以手动处理它们)。 根据数据加载通常有50万个数据,sumif之后它应该只返回大约5000个行项目。这个过程试图避免在Excel中进行大量的数据处理。 – Isu

+0

'完全没有accountID的人'......这是没有道理的,因为你正在进行自我加入。原则上,连接两侧的帐号ID组相同。 –

+0

啊,你已经明白了,正如我刚才提到的,我是SQL新手,在Excel中有空白单元格时,当你完成sumif时,它会返回0.但是你的观点是正确的,在这里不需要担心。 – Isu