如何在Sql Server中汇总列 [英] How Do I Sum The Column In Sql Server

查看:142
本文介绍了如何在Sql Server中汇总列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

HI all,

我如何根据1到12,13到24之间的欠款来计算收款金额。





集合advisor_Code Plan_name advisor_id到期否
3200 1010200022 GIFDL - 36 127 1
1000 1010200022 GIFDL - 36 127 2
1000 1010200022 GIFDL - 36 127 3
1000 1010200022 GIFDL - 36 127 4
5000 1010200022 GIFDL - 36 127 12
5000 1010200022 GIFDL - 36 127 13











i我期待





集合advisor_Code Plan_name advisor_id到期没有
6200 1010200022 GIFDL - 36 127 1-12

10000 1010200022 GIFDL - 36 127 12-24

解决方案





首先,你说你想要1号,12号,13号等24号,但是你想要的是结果[到期号码]是12-24,而不是13-24 ...



这是我的样本(1-12,13-24,25-36):

  CREATE   TABLE  #TempData 
([Collection] INT
[advisor_Code] VARCHAR 50 ),
[Plan_name] VARCHAR 50 ),
[advisor_id] INT
[Due_No] INT );

INSERT INTO #TempData([Collection],[advisor_Code],[ Plan_name],[advisor_id],[Due_No])
VALUES 3200 ' 1010200022'' GIFDL - 36' 127 1 ),
1000 ' 1010200022',< span class =code-string>' GIFDL - 36' 127 ,< span class =code-digit> 2 ),
1000 ' 1010200022'' GIFDL - 36' 127 3 ),
1000 ' 1010200022'' GIFDL - 36' 127 4 ),
5000 ' 1010200022'' GIFDL - 36' 127 12 ),
5000 ' 1010200022'' GIFDL - 36' 127 13 );


; WITH 范围
AS (< span class =code-keyword> SELECT 1 AS [RangeFrom],
12 AS [RangeTo]
UNION ALL
SELECT ([RangeTo] + 1 AS [RangeFrom],
([RangeTo] + 12 AS [RangeTo]
FROM 范围
WHERE [RangeTo]< 36
SELECT SUM([Collection]) AS [Collection],
[advisor_Code],
[Plan_name],
[advisor_id],
CAST([RangeFrom] AS VARCHAR 10 ))+ ' - ' + CAST([RangeTo] AS VARCHAR 10 )) AS [Due_No]
FROM 范围 AS r
LEFT OUTER JOIN #TempData AS t
ON t。[Due_No]> = r。[RangeFrom]
AND t。[Due_No]< = r。[RangeTo]
GROUP BY [RangeFrom],
[RangeTo],
[advisor_Code],
[Plan_name],
[advisor_id]
OPTION (MAXRECURSION 32767 );


DROP TABLE #TempData;



Max [Due_No]限制为36( WHERE [RangeTo]< 36 )。您可以使用表格或表格变量代替CTE。



结果:

 集合advisor_Code Plan_name advisor_id Due_No  
11200 1010200022 GIFDL - 36 127 1-12
5000 1010200022 GIFDL - 36 127 13-24
NULL NULL NULL NULL 25-36


HI all,
how do i sum the collection amount based on the Due no's like 1 to 12 , 13 to 24,..


Collection	advisor_Code	Plan_name	advisor_id	Due No
3200	        1010200022  	GIFDL - 36	127	        1
1000    	1010200022	GIFDL - 36	127      	2
1000	        1010200022	GIFDL - 36	127	        3
1000	        1010200022	GIFDL - 36	127      	4
5000            1010200022	GIFDL - 36      127      	12
5000            1010200022	GIFDL - 36      127      	13






i am expecting


Collection  advisor_Code    Plan_name   advisor_id  Due No
6200         1010200022   GIFDL - 36    127         1-12

10000        1010200022  GIFDL - 36     127         12-24

解决方案

Hi,

First of all, you said that you want Due No's like 1 to 12, 13 to 24, etc., but in your expected result [Due No] is 12-24, not 13-24...

Here's my sample (1-12, 13-24, 25-36):

CREATE TABLE #TempData
  ([Collection]   INT,
   [advisor_Code] VARCHAR(50),
   [Plan_name]    VARCHAR(50),
   [advisor_id]   INT,
   [Due_No]       INT);

INSERT INTO #TempData ([Collection], [advisor_Code], [Plan_name], [advisor_id], [Due_No])
VALUES	(3200, '1010200022', 'GIFDL - 36', 127, 1),
	(1000, '1010200022', 'GIFDL - 36', 127, 2),
	(1000, '1010200022', 'GIFDL - 36', 127, 3),
	(1000, '1010200022', 'GIFDL - 36', 127, 4),
	(5000, '1010200022', 'GIFDL - 36', 127, 12),
	(5000, '1010200022', 'GIFDL - 36', 127, 13);


;WITH Ranges
     AS (SELECT 1  AS [RangeFrom],
                12 AS [RangeTo]
         UNION ALL
         SELECT ( [RangeTo] + 1 )  AS [RangeFrom],
                ( [RangeTo] + 12 ) AS [RangeTo]
         FROM   Ranges
         WHERE  [RangeTo] < 36)
SELECT SUM([Collection]) AS [Collection],
       [advisor_Code],
       [Plan_name],
       [advisor_id],
       CAST([RangeFrom] AS VARCHAR(10)) + '-' + CAST([RangeTo] AS VARCHAR(10)) AS [Due_No]
FROM   Ranges AS r
       LEFT OUTER JOIN #TempData AS t
                    ON t.[Due_No] >= r.[RangeFrom]
                       AND t.[Due_No] <= r.[RangeTo]
GROUP  BY [RangeFrom],
          [RangeTo],
          [advisor_Code],
          [Plan_name],
          [advisor_id]
OPTION (MAXRECURSION 32767); 


DROP TABLE #TempData;


Max [Due_No] is limited to 36 (WHERE [RangeTo] < 36). Instead of CTE you can use a table or table variable.

Result:

Collection	advisor_Code	Plan_name	advisor_id	Due_No
11200		1010200022	GIFDL - 36	127		1-12
5000		1010200022	GIFDL - 36	127		13-24
NULL		NULL		NULL		NULL		25-36


这篇关于如何在Sql Server中汇总列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆