Sql server 如何根据模式1:2、1:1每天最多5对的计算特定父项下的总对数
我正在做一个项目,在这个项目中,成员以树模式添加,并获得相应的付款 下面是我的表结构、数据和存储过程Sql server 如何根据模式1:2、1:1每天最多5对的计算特定父项下的总对数,sql-server,tsql,Sql Server,Tsql,我正在做一个项目,在这个项目中,成员以树模式添加,并获得相应的付款 下面是我的表结构、数据和存储过程 CREATE TABLE Associate_Income ( ID varchar(30) NOT NULL, ParentID varchar(30) NULL, IsLeft tinyint NULL, IsRight tinyint NULL
CREATE TABLE Associate_Income
(
ID varchar(30) NOT NULL,
ParentID varchar(30) NULL,
IsLeft tinyint NULL,
IsRight tinyint NULL,
joingdate datetime NOT NULL
)
INSERT Associate_Income
(ID, ParentID, IsLeft, IsRight, joingdate)
SELECT 'Ramesh123', NULL, NULL, NULL '2014-01-03 16:31:15.000' UNION ALL
SELECT 'Sonu', 'Ramesh123', 1, NULL, '2014-01-03 16:45:21.000' UNION ALL
SELECT 'Pawan kumar', 'Ramesh123', NULL, 1, '2014-01-04 16:50:23.000' UNION ALL
SELECT 'Ravi123', 'Sonu', 1, NULL, '2014-01-04 17:03:22.000' UNION ALL
SELECT 'Vineet123', 'Sonu', NULL, 1, '2014-01-04 17:26:01.000' UNION ALL
SELECT 'dev123', 'Ravi123', 1, NULL, '2014-01-05 19:35:16.000' UNION ALL
SELECT 'Mukesh123', 'Ravi123', NULL, 1, '2014-01-05 19:40:41.000' UNION ALL
SELECT 'poonam123', 'Vineet123', 1, NULL, '2014-01-05 19:49:49.000' UNION ALL
SELECT 'monu', 'Pawan kumar', 1, NULL, '2014-01-05 17:32:58.000' UNION ALL
SELECT 'Arti123', 'Pawan kumar', NULL, 1, '2014-01-05 19:54:35.000' UNION ALL
我的数据库表Associate_收入结构如下:
ID ParentID IsLeft IsRight joingdate
Ramesh123 NULL NULL NULL 2014-01-03 16:31:15.000
Sonu Ramesh123 1 NULL 2014-01-03 16:45:21.000
Pawan kumar Ramesh123 NULL 1 2014-01-04 16:50:23.000
Ravi123 Sonu 1 NULL 2014-01-04 17:03:22.000
Vineet123 Sonu NULL 1 2014-01-04 17:26:01.000
dev123 Ravi123 1 NULL 2014-01-05 19:35:16.000
Mukesh123 Ravi123 NULL 1 2014-01-05 19:40:41.000
poonam123 Vineet123 1 NULL 2014-01-05 19:49:49.000
monu Pawan kumar 1 NULL 2014-01-05 17:32:58.000
Arti123 Pawan kumar NULL 1 2014-01-05 19:54:35.000
通过使用下面的存储过程,我可以以2:1的比例计算特定节点下的总对数,1:1的比例意味着,当两个节点添加到给定父节点的左侧,一个节点添加到给定父节点的右侧时,第一对就完成了。之后,当一个节点添加到父节点的左侧,一个节点添加到父节点的右侧时,所有对都完成了父节点(1:1比率)
示例:如果我按如下所示执行存储过程,它将返回以下结果
执行计数\u对“Ramesh123”
exec count_pairs 'Ramesh123'
Result
Joingdate Completed Pair
2014-01-03 13:54:35.000 0
2014-01-04 14:56:35.000 0
2014-01-05 15:58:35.000 0
2014-01-06 16:54:35.000 1
2014-01-07 14:54:35.000 0
2014-01-07 15:34:35.000 1
2014-01-07 15:54:35.000 0
2014-01-09 11:54:35.000 0
2014-01-09 14:64:35.000 0
2014-01-23 17:54:35.000 1
三,
所以有3对,如图所示
当我们执行ParentID“sonu”的存储过程时,它将返回以下内容
执行计数\u对“sonu”
Result
Joingdate Completed Pair
2014-01-03 13:54:35.000 0
2014-01-04 14:56:35.000 0
2014-01-05 15:58:35.000 0
2014-01-06 16:54:35.000 0
2014-01-07 14:54:35.000 0
2014-01-07 15:34:35.000 0
2014-01-07 15:54:35.000 1
2014-01-09 11:54:35.000 0
2014-01-09 14:64:35.000 1
2014-01-23 17:54:35.000 0
二,
它返回2
表示节点“sonu”共有2对,如图所示,但
我的问题是
如何计算节点“sonu”当天完成的对总数('2014-01-03 16:31:15.000')、当天完成的对总数(2014-01-04 16:31:15.000)和当天完成的对总数(2014-01-05 16:31:15.000)
。截至给出的最后日期
CREATE proc [dbo].[count_pairs]
(
@ParentID nvarchar(50)
)
as
begin
Declare @ParentSUM SMALLINT = 0
Declare @SubLeftID nvarchar(50)
Declare @SubRightID nvarchar(50)
SELECT @SubLeftID = CASE WHEN [IsLeft] = 1 THEN [ID] ELSE @SubLeftID END
,@SubRightID = CASE WHEN [IsRight] = 1 THEN [ID] ELSE @SubRightID END
FROM Associate_Income
WHERE ParentID = @ParentID
IF @SubLeftID IS NOT NULL AND @SubRightID IS NOT NULL AND EXISTS(SELECT 1 FROM Associate_Income
WHERE [IsLeft] = 1 AND ParentID = @SubLeftID)
BEGIN
SET @ParentSUM = 1
;WITH Associate_Income_CTE AS
(
SELECT [ID], [ParentID], [IsLeft], [IsRight], 0 AS [Level]
FROM Associate_Income
WHERE [ParentID] = @ParentID
UNION ALL
SELECT RecursiveMember.[ID], RecursiveMember.[ParentID], RecursiveMember.[IsLeft], RecursiveMember.[IsRight], Level + 1
FROM Associate_Income RecursiveMember
INNER JOIN Associate_Income_CTE AnchorMember
ON RecursiveMember.[ParentID] = AnchorMember.[ID]
)
SELECT @ParentSUM = @ParentSUM + COUNT([ParentID])
FROM
(
SELECT [ParentID]
,'IsLeft' AS [Direction]
,1 AS [Value]
FROM Associate_Income
WHERE [IsLeft] = 1
AND [ID] <> @ParentID --AND [ID] NOT IN (@SubLeftID, @ParentID)
AND [ParentID] NOT IN (@ParentID, @SubLeftID)
UNION ALL
SELECT [ParentID]
,'IsRight' AS [Direction]
,1 AS [Value]
FROM Associate_Income
WHERE [IsRight] = 1
AND [ParentID] <> @ParentID
) AS Associate_Income
PIVOT
(
MAX([Value]) FOR [Direction] IN ([IsLeft], [IsRight])
) PVT
WHERE [IsLeft] IS NOT NULL AND [IsRight] IS NOT NULL
END
SELECT @ParentSUM
还有“sonu”
执行计数\u对“sonu”
Result
Joingdate Completed Pair
2014-01-03 13:54:35.000 0
2014-01-04 14:56:35.000 0
2014-01-05 15:58:35.000 0
2014-01-06 16:54:35.000 0
2014-01-07 14:54:35.000 0
2014-01-07 15:34:35.000 0
2014-01-07 15:54:35.000 1
2014-01-09 11:54:35.000 0
2014-01-09 14:64:35.000 1
2014-01-23 17:54:35.000 0
请任何人都能给我一些宝贵的建议,想法或解决方案
提前感谢所有这些都有问题吗?是的,这是一个问题,如何根据模式1:2、1:1每天最多5对的上限找到特定父项下的总对数