0

以下は私のテーブルです:

【ユーザーマスター】

UserId Int、UserName Varchar(200)、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_UserMaster_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)、Quantity 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

[出力]

結果セットには、ログイン ユーザー + 彼によって作成されたユーザーと、そのサブ ユーザーによって作成された追加のユーザーの売上が含まれている必要があります。

次の TotalSalesAmount は次のとおりです。

[SalesMaster].Price * [SalesProducts].Quantity

例: 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:

(admin)UserId=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

ケース 2: (Vikas)UserId=3 がログインする場合、以下を表示する必要があります

 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 

私が使用したテーブルスクリプトとデータはこちら http://test-admin.teamberry.biz/SalesScript.rar

このスクリプトを実行した後、クエリ take UM.UserId=164, SM.statusID = 1 の下で実行してください UserId=166 の TotalSalesAmount は、その TotalSaleAmount が ownSaleAmount と同じである必要があるため、間違っています。つまり、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 
4

1 に答える 1

1

私の理解が間違っている場合は更新してください:

  1. userID 3 の場合、TotalSalesAmount = 300*1 + 500*1 + 111*5 (userID 3 の userID 4 サブユーザーによって作成された userID 5 の SaleAmount は含まれません) を取得しました。したがって、userID 3 の TotalSalesAmount は、1355 ではなく、300*1 + 500*1 +300*1 + 111*5 = 1655 として計算する必要があります。

上記の理解が正しければ、共通テーブル式の再帰機能を使用して目的の結果を取得し、現在の合計を次のように計算できます。

-- create a common table expression to get OwnSaleAmount for logged in user and all the users who are added現在のユーザーとさらに。

 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 ステートメントを追加する必要があります。

于 2013-10-04T13:02:10.873 に答える