SQL表结构-经销商定价

时间:2019-01-02 12:33:08

标签: sql sql-server

如何更改以下结构以允许每个帐户检查其销售额和利润,这种情况是子帐户购买某商品的情况,这意味着每个父帐户都可以赚取利润。也许我们应该添加一个新表,我不确定

帐户表:

 AccountId   ParentId   
 ----------- ----------- 
 5136        Null
 3126        5136        
 2123        3126

定价表:(这是每个帐户的购买价格)

 AccountId   ItemId      Price
 ----------- ----------- -------------
 5136        211         0.14
 3126        211         0.175
 2123        211         0.19

销售表:

  id   AccountId   ItemId       SellingDate
  --   ----------- -----------  ------------
   1   2123        211          2019-01-01 09:23:45
   2   2126        211          2019-01-01 10:07:21

2 个答案:

答案 0 :(得分:0)

我认为您需要在销售表中添加两个新列  数量和售价。

  id   AccountId   ItemId       SellingDate             Quantity        SellingPrice
  --   ----------- -----------  ------------           ----------       ------------
   1   2123        211          2019-01-01 09:23:45         1               0.20
   2   2126        211          2019-01-01 10:07:21         1               0.30

答案 1 :(得分:0)

如果孩子和其最高亲生父母之间的最大水平深度未知。
然后不确定是否需要更改表。

对于给定的父级帐户,您可以使用递归CTE来获取其子级帐户。
然后使用它来获取父母(包括孩子)的销售和价格。

WITH RCTE AS
(
   SELECT AccountId as BaseAccountId, 0 as Lvl, AccountId, ParentId
   FROM Account
   WHERE AccountId IN (5136, 3126, 2123)

   UNION ALL

   SELECT c.BaseAccountId, c.Lvl + 1, r.AccountId, r.ParentId
   FROM RCTE c
   JOIN Account r ON r.ParentId = c.AccountId
)
SELECT 
 c.BaseAccountId AS AccountId,
 COUNT(s.ItemId) AS TotalItems,
 SUM(p.Price) AS TotalPrice
FROM RCTE c
LEFT JOIN Sales s ON s.AccountId = c.AccountId
LEFT JOIN Pricing p ON p.ItemId = s.ItemId AND p.AccountId = c.BaseAccountId
GROUP BY c.BaseAccountId
ORDER BY c.BaseAccountId;

但是最好在Account.ParentId上有一个索引