【问题标题】:SUM first table on second CATEGORY table在第二个 CATEGORY 表上求和第一个表
【发布时间】:2015-01-08 17:53:46
【问题描述】:

我有一张桌子 ProdByCat

CatID      ProductID 
---------------------------
Food        Beans
Food        Corn
Food        Peas
Drink       Juice
Drink       Wine

还有一张桌子购买

Region        ProductID   Cost
-----------------------------
North         Beans       5
South         Beans       5
West          Beans       5
North         Corn        5
North         Peas        5 
West          Wine        10
West          Juice       10 

我想要的是有一个返回的表

Region     CatID   TotalCost
-----------------------------
North      Food    15
South      Food    5
West       Food    5
West       Drink   20

我确信我把它复杂化了。这是我旅行的方向:

select P.Region, Y.CatID, SUM(P.Cost) As 'TotalCost'
from Purchases As P, 
(   select distinct(A.CatID), 
    Includes=( stuff ( 
         select ''''+ ProductID + ''','  
         from ProdByCat B
         where B.CatID = A.CatID
         order by ProductID
         for xml path ('')
         ),1,1,'')
    from ProdByCat A
) Y
where ProductID in (Y.Includes)
group by P.Region, Y.CatID

这太令人兴奋了。从语法上讲,它可以工作,但返回一个空集。

我的想法是,如果我使用 xml 路径函数,我可以创建一个包含列表,如果 ProductID 存在于其中,我可以创建一个总和。

【问题讨论】:

  • 为什么Drink 的区域为North
  • Y.Includes LIKE'%' + CAST(ProductID as NVARCHAR(32)) + '%'

标签: sql sql-server tsql sum


【解决方案1】:

你是对的。你把它复杂化了。它可以简单得多:

SELECT p.Region, pbc.CatID, SUM(p.Cost) AS TotalCost
    FROM Purchases p
        INNER JOIN ProdByCat pbc
            ON p.ProductID = pbc.ProductID
    GROUP BY p.Region, pbc.CatID;

【讨论】:

    【解决方案2】:

    看起来像 Group bySum 聚合应该可以工作。试试这个。

    您的预期结果有一个错误,最后一行应该是West Drink 20。区域应该是West 而不是North

    SELECT Region,
           CatID,
           Sum(cost) TotalCost
    FROM   ProdByCat A
           JOIN Purchases b
             ON a.ProductID = b.ProductID
    GROUP  BY Region,
              CatID 
    

    【讨论】:

      【解决方案3】:

      让我们创建测试数据:

      DECLARE @ProdByCat TABLE
      (
          CatID VARCHAR(10),
          ProductID VARCHAR(10)
      )
      
      INSERT INTO @ProdByCat
      ( CatID, ProductID )
      VALUES
      ('Food'        ,'Beans'),
      ('Food'        ,'Corn'),
      ('Food'        ,'Peas'),
      ('Drink'       ,'Juice'),
      ('Drink'       ,'Wine');
      
      DECLARE @Purchases TABLE
      (
          Region VARCHAR(10),
          ProductID VARCHAR(10),
          Cost int
      )
      
      INSERT INTO @Purchases
      ( Region, ProductID, Cost )
      VALUES
      ('North',         'Beans',       5),
      ('South',         'Beans',       5),
      ('West',          'Beans',       5),
      ('North',         'Corn',        5),
      ('North',         'Peas',        5),
      ('West',          'Wine',        10),
      ('West',          'Juice',       10); 
      

      现在我们将通过加入和分组来获取每个类别的成本:

      SELECT p.Region, pc.CatId, SUM(COST) AS Cost 
      FROM @Purchases p
      INNER JOIN @ProdByCat pc
          ON p.ProductID = pc.ProductID
      GROUP BY p.Region, pc.CatID
      ORDER BY p.Region, pc.CatID DESC
      

      输出:

      Region  CatId   Cost
      North   Food    15
      South   Food    5
      West    Food    5
      West    Drink   20
      

      【讨论】:

        【解决方案4】:

        要生成您描述的表,您只需要一个内部连接和一个 group by

        select 
            Region = p.Region,
            CatID = c.CatID,
            TotalCost = sum(Cost)
        from #ProdByCat c
        inner join #Purchases p
            on c.ProductID = p.ProductID
        group by p.Region, c.CatID
        

        但是您的 for xml 代码听起来像是您正在寻找与每个组关联的产品的分隔列表。如果这是您需要的,请告诉我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          相关资源
          最近更新 更多