Sql 根据角色类型从3个表中获取分层数据

Sql 根据角色类型从3个表中获取分层数据,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,以下是我的表格: [用户主机] UserId Int,UserName Varchar200,AddedBy Int UserId EmpName AddedBy 1 admin 0 2 SubAdmin1 1 3 Vikas 2 4 Mohit 3 5 Atul 4

以下是我的表格:

[用户主机]

UserId Int,UserName Varchar200,AddedBy Int

UserId     EmpName           AddedBy
1          admin             0
2          SubAdmin1         1
3          Vikas             2
4          Mohit             3
5          Atul              4
6          Vishal            2
7          Mani              3
8          Sunny             1
[销售员]

SalesId Int,UserId Int FK\u UserMaster\u UserId,Price Int

SalesId  UserId    Price         StatusId
10        1        100         1 
11        2        200         1    
12        3        300         1
13        4        500         1
14        5        100             2
15        6        200             1
16        7        111             2
17        8        222             1
[销售产品]

SaleProductId Int,SaleId Int FK_SaleMaster_SaleId,数量Int

SaleProductId    SalesId   Quantity

  1                10       2
  2                11       2
  3                12       1
  4                13       1
  5                14       3
  6                15       2
  7                16       5
  8                17       1
[输出]

结果集应该包含登录用户+他创建的用户和他们的子用户创建的其他用户的销售额

以下总销售额为:

[SalesMaster]。价格*[SalesProducts]。数量

例如:UserId:1的总销售额为 100*2+200*2+300*1+500*1+100*3+200*2+111*5+222*1=2877

与UserId类似:2是 200*2+300*1+200*2+500*1+111*5+200*2=2555

案例1:

如果adminUserId=1将登录,我们需要显示以下内容

UserId     TotalSalesAmount    OwnSaleAmount           AddedBy

  1          2877         200               0

  2          2555         400               1

  3          1355             300               2

  4          800          500           3

  5          100*3= 300       300           4

  6          200*2=200        200           2

  7          111*5= 555       555               3

  8          222*1= 222       222           1
 UserId      TotalSalesAmount           OwnSaleAmount           AddedBy

  3          300*1 + 500*1 + 111*5= 1355            300                2

  4          500*1 + 100*3= 800                     500                3

  5          100*3= 300                         300            4

  7          111*5= 555                     555                3 
案例2: 如果VikaUserID=3将登录,我们需要显示以下内容

UserId     TotalSalesAmount    OwnSaleAmount           AddedBy

  1          2877         200               0

  2          2555         400               1

  3          1355             300               2

  4          800          500           3

  5          100*3= 300       300           4

  6          200*2=200        200           2

  7          111*5= 555       555               3

  8          222*1= 222       222           1
 UserId      TotalSalesAmount           OwnSaleAmount           AddedBy

  3          300*1 + 500*1 + 111*5= 1355            300                2

  4          500*1 + 100*3= 800                     500                3

  5          100*3= 300                         300            4

  7          111*5= 555                     555                3 
这里是我使用的表脚本和数据 ,

运行此脚本后,请执行下面的查询take UM.UserId=164,SM.statusID=1 UserId=166的TotalSalesAmount出现错误,因为它的TotalSalesAmount应该与OwnSalesAmount相同,即444,因为UserId=166没有任何子项

with tblOwnSaleAmount as 
 ( 
      select UM.UserId,UM.EmpName,UM.AddedBy,cast(sum( SM.Price*SP.Quantity) as int) as OwnSaleAmount 
      from UserMaster UM
      left join SalesMaster SM on SM.UserId = UM.UserId  and SM.statusID = 1
      left join SalesProducts SP on SP.SalesId = SM.SalesId
      where UM.UserId = 164
      group by  UM.UserId ,UM.AddedBy,UM.EmpName 
      union all 
      select UM.UserId,UM.EmpName, UM.AddedBy, 
      case when SM.statusID = 1 then cast(( SM.Price*SP.Quantity ) as int)
      else 0 end as OwnSaleAmount
      from UserMaster UM
      join tblOwnSaleAmount on tblOwnSaleAmount.UserId = UM.AddedBy
      join SalesMaster SM on SM.UserId = UM.UserId 
      join SalesProducts SP on SP.SalesId = SM.SalesId 
 )
,  tbldistinctOwnSaleAmount as
 (
 select distinct UserId,EmpName, AddedBy,Isnull(OwnSaleAmount,0) as  OwnSaleAmount
 from tblOwnSaleAmount
 )
 ,

 tblTotalOwnSaleAmount as
 (
  select OSA.UserId,OSA.EmpName, OSA.AddedBy, sum( OSA.OwnSaleAmount ) as OwnSaleAmount
  from tbldistinctOwnSaleAmount OSA --inner join tbldistinctOwnSaleAmount A on OSA.AddedBy = A.UserID
  group by OSA.UserId ,OSA.AddedBy,OSA.EmpName
 )
 select OSA.* 
, TotalSalesAmount = isnull(
( 
    select sum( OSA1.OwnSaleAmount )
    from tblTotalOwnSaleAmount OSA1
    where OSA1.UserId > OSA.UserId 
), 0 )
+ OSA.OwnSaleAmount
 from tblTotalOwnSaleAmount OSA  
 order by OSA.UserId 

如果我的理解有误,请更新:

对于用户标识3,您已获取用户标识5的TotalSalesAmount=300*1+500*1+111*5未包含的销售金额,而用户标识5又由用户标识4子用户为用户标识3创建。那么总销售额呢 对于用户标识3,应计算为:300*1+500*1+300*1+111*5=1655,而不是1355。 如果我的上述理解是正确的,您可以使用公共表表达式的递归功能获得所需的结果,然后计算运行总数,如下所示:

-创建一个公共表表达式,以获取登录用户以及当前用户和其他用户添加的所有用户的OwnSaleAmount

 with tblOwnSaleAmount as 
 ( 
      select UM.UserId, UM.AddedBy, ( SM.Price*SP.Quantity ) as OwnSaleAmount 
      from UserMaster UM
      join SalesMaster SM on SM.UserId = UM.UserId 
      join SalesProducts SP on SP.SaleId = SM.SalesId 
      where UM.UserId = 1 -- Userid of logged in user which will act as anchor member 
                          -- for later subqueries
      union all 

      select UM.UserId, UM.AddedBy, ( SM.Price*SP.Quantity ) as OwnSaleAmount  
      from UserMaster UM
      join tblOwnSaleAmount on tblOwnSaleAmount.UserId = UM.AddedBy
      join SalesMaster SM on SM.UserId = UM.UserId 
      join SalesProducts SP on SP.SaleId = SM.SalesId 

 )
 select OSA.* 
, TotalSalesAmount = isnull(
( 
    select sum( OSA1.OwnSaleAmount )
    from tblOwnSaleAmount OSA1
    where OSA1.AddedBy > = OSA.UserId                                                                   
), 0 )
+ OSA.OwnSaleAmount
 from tblOwnSaleAmount OSA
 order by OSA.UserId 
编辑:更新的查询:

 --1. Corrected joins in anchor query to fetch records for users who have no records in SalesMaster Table.
 --2. IS it another requirement that user entries with status id = 2 should not be considered?
 with tblOwnSaleAmount as 
 ( 
      select UM.UserId, UM.AddedBy, sum( SM.Price*SP.Quantity ) as OwnSaleAmount 
      from UserMaster UM
      left join SalesMaster SM on SM.UserId = UM.UserId -- Missed requirement1
      left join SalesProducts SP on SP.SaleId = SM.SalesId -- Missed requirement1
      where UM.UserId = 2 -- Userid of logged in user which will act as anchor member 
      group by  UM.UserId ,UM.AddedBy                  -- for later subqueries

      union all 

      select UM.UserId, UM.AddedBy, ( SM.Price*SP.Quantity ) as OwnSaleAmount  
      from UserMaster UM
      join tblOwnSaleAmount on tblOwnSaleAmount.UserId = UM.AddedBy
      join SalesMaster SM on SM.UserId = UM.UserId 
      join SalesProducts SP on SP.SaleId = SM.SalesId 

 ),
  tbldistinctOwnSaleAmount as
 (
 select distinct UserId, AddedBy, OwnSaleAmount 
 from tblOwnSaleAmount
 ) ,
 tblTotalOwnSaleAmount as
 (
  select OSA.UserId,OSA.AddedBy, sum( OSA.OwnSaleAmount ) as OwnSaleAmount
  from tbldistinctOwnSaleAmount OSA
  group by OSA.UserId ,OSA.AddedBy
 )
 select OSA.* 
, TotalSalesAmount = isnull(
( 
    select sum( OSA1.OwnSaleAmount )
    from tblTotalOwnSaleAmount OSA1
    where OSA1.UserId > OSA.UserId                                                                   
), 0 )
+ OSA.OwnSaleAmount
 from tblTotalOwnSaleAmount OSA
 order by OSA.UserId 
希望这有帮助

[EDIT2]:已更新缺失需求2的查询:

 --2. IS it another requirement that user entries with status id = 2 should not be considered? -- Yes!!!
 with tblOwnSaleAmount as 
 ( 
      select UM.UserId, UM.AddedBy, sum( SM.Price*SP.Quantity ) as OwnSaleAmount 
      from UserMaster UM
      left join SalesMaster SM on SM.UserId = UM.UserId  and SM.statusID = 1-- Missed requirement1 and 2
      left join SalesProducts SP on SP.SaleId = SM.SalesId -- Missed requirement1
      where UM.UserId = 2 -- Userid of logged in user which will act as anchor member 
      group by  UM.UserId ,UM.AddedBy                  -- for later subqueries

      union all 

      select UM.UserId, UM.AddedBy, 
      case when SM.statusID = 1 then ( SM.Price*SP.Quantity ) 
      else 0 end as OwnSaleAmount  --Missed Requirement 2.
      from UserMaster UM
      join tblOwnSaleAmount on tblOwnSaleAmount.UserId = UM.AddedBy
      join SalesMaster SM on SM.UserId = UM.UserId 
      join SalesProducts SP on SP.SaleId = SM.SalesId 

 ),
  tbldistinctOwnSaleAmount as
 (
 select distinct UserId, AddedBy, OwnSaleAmount 
 from tblOwnSaleAmount
 ) ,
 tblTotalOwnSaleAmount as
 (
  select OSA.UserId,OSA.AddedBy, sum( OSA.OwnSaleAmount ) as OwnSaleAmount
  from tbldistinctOwnSaleAmount OSA
  group by OSA.UserId ,OSA.AddedBy
 )
 select OSA.* 
, TotalSalesAmount = isnull(
( 
    select sum( OSA1.OwnSaleAmount )
    from tblTotalOwnSaleAmount OSA1
    where OSA1.UserId > OSA.UserId                                                                   
), 0 )
+ OSA.OwnSaleAmount
 from tblTotalOwnSaleAmount OSA
 order by OSA.UserId 

要获得正确的结果,您需要更新锚定表的on谓词,然后为进一步的递归表添加case语句。

感谢您宝贵的反馈。它对我起作用了,除了我在查询中做了一点更改外,我已将Addedby更改为UserId select OSA.*,TotalSalesAmount=isnull从tblOwnSaleAmount OSA1中选择sum OSA1.ownsalealeAmount,其中OSA1.UserId>=OSA.UserId-ctm,0请查看。。。如果登录用户在SalesMaster表中没有记录,则查询返回的结果为零。此外,如果SalesMaster表中有多个相同用户ID的条目,则结果也不正确。提前谢谢。嗨。刚刚看到你的最新要求。你们还在寻找答案吗?好吧,我必须向你们的SQL技能致敬。是的,我还在寻找这个问题。请根据您的要求回答更新后的查询。不应考虑状态id为2的用户条目是否是另一项要求?