2015-11-19 58 views
2

我有一个数据集,我想按客户代码进行分组,我希望将每个日期之间的总和交易总和计算在一起,并且每月成为一个单独的专栏。我可以使这种动态我主要关心的是构建初始选择输出所需的数据。我怎样才能按日期划分分组数据

我有什么:

SELECT [cmasterno] 
    ,CASE 
     WHEN Month([dtrs]) = 1 
      AND Year([dtrs]) = YEAR(GETDATE()) 
      THEN SUM([nftrsamt]) 
     END AS 'Jan 2014' 
    ,CASE 
     WHEN Month([dtrs]) = 2 
      AND Year([dtrs]) = YEAR(GETDATE()) 
      THEN SUM([nftrsamt]) 
     END AS 'Feb 2014' 
FROM [AccountMate].[dbo].[gltrsn] 
WHERE csource LIKE 'AR' 
    AND cacctid LIKE '%4220%' 
GROUP BY cmasterno 

数据的样本将

cmasterno dtrs ntrsamt 
CEN01-A 1/24/2014 -22.2 
AUT129-A 2/24/2014 -0.84 
CEN01-A 1/22/2014 -19.86 
CEN01-A 2/22/2014 -13.2 
AUT129-A 1/22/2014 -18.42 
AUT129-A 1/22/2014 -1 
AUT129-A 2/22/2014 -316.56 
CEN01-A 2/21/2014 -2.04 

回答

2

使用条件SUM

SELECT [cmasterno], 
     SUM (CASE 
       WHEN Month([dtrs]) = 1 AND Year([dtrs]) = YEAR(GETDATE()) 
        THEN [nftrsamt] 
       ELSE 0 
      END 
      ) AS 'Jan 2014', 
     SUM (CASE 
       WHEN Month([dtrs]) = 2 AND Year([dtrs]) = YEAR(GETDATE()) 
        THEN [nftrsamt] 
       ELSE 0 
      END 
      ) AS 'Feb 2014' 
FROM [AccountMate].[dbo].[gltrsn] 
WHERE csource LIKE 'AR' 
    AND cacctid LIKE '%4220%' 
GROUP BY cmasterno 
+0

看起来像这将工作测试,我让你知道。谢谢 !!我没有想到将这笔款项转移到案件之外! –

+0

应该工作。不要担心你必须在途中学习这些东西。你可以用'COUNT()'或者'AVG()'做同样的工作。 –

+0

Yup像梦一样工作谢谢 –

1

只是要完成你可以加入也做到这一点

SELECT [cmasterno], sum(jan.nftrsamt) as 'Jan 2014', sum(feb.nftrsamt) as 'Feb 2014' 
FROM [AccountMate].[dbo].[gltrsn] b 
LEFT JOIN [AccountMate].[dbo].[gltrsn] jan on b.cacctid = jan.cacctid and Month(jan.[dtrs]) = 1 AND Year(jan.[dtrs]) = YEAR(GETDATE()) 
LEFT JOIN [AccountMate].[dbo].[gltrsn] feb on b.cacctid = feb.cacctid and Month(feb.[dtrs]) = 2 AND Year(feb.[dtrs]) = YEAR(GETDATE()) 
WHERE csource LIKE 'AR' AND cacctid LIKE '%4220%' 
GROUP BY cmasterno 

根据您的索引,联接可以比案例快得多。这是O(1)而不是O(N)

+0

同样一个很好的方法谢谢 –