Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 如何根据模式1:2、1:1每天最多5对的计算特定父项下的总对数_Sql Server_Tsql - Fatal编程技术网

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对的上限找到特定父项下的总对数