子表汇总和泛化的SQL查询

时间:2012-01-16 11:00:09

标签: sql sql-server tsql

我有4张表格,下面是图表 enter image description here

我想概括查询Institution表。在哪里我想得到的结果,

InstitutionType ProductName Quantity

例如。机构表的样本数据

 Id   Name  Address  InstitionTypeId
  1   aaa   ny132    1001
  2   bbb   dx23     1001  
  3   ccc   bn33     1002  

InstitionProduct就像那样

     Id  ProductId  Quantity  InstitionId
      1   1000       120       1
      2   1000       100       2
      3   1000       50        3      

然后我想要一个查询结果,按Instition Type明智地输出给定产品的总数量。示例输出将如下所示。

InstitutionTypeId  productId  quantity
1001               1000        220
1002               1000        50 

所以我想按类型对机构进行分组,并汇总所有机构类型组的产品数量。

我尝试使用group by子句,但产品数量不是分组元素,导致错误。

2 个答案:

答案 0 :(得分:3)

SELECT
  Institution.InstitutionTypeID,
  InstitutionProduct.ProductID,
  SUM(InstitutionProduct.Quantity)
FROM
  Institution
LEFT JOIN
  InstitutionProduct
    ON InstitutionProduct.InstitutionID = Institution.ID
GROUP BY
  Institution.InstitutionTypeID,
  InstitutionProduct.ProductID

答案 1 :(得分:1)

如果您要使用group查询,则需要使用聚合函数或按所有包含的字段分组。原因是,'group by'每个'group by'返回一行只有一行,所以如果你引入一个未分组的字段,如果该字段每个分组约束有多个值,则会发生冲突。即使您的数据集可能不是这种情况,查询引擎也无法知道这一点,并引发错误。

解决方案是为所有非分组字段引入聚合,其中聚合(以及其他):平均(avg),汇总(sum),最小(min)和最大(max)。这会导致像

这样的东西
   SELECT i.InstitutionTypeID, i.Institution.ID, SUM(ip.Quantity) 
   FROM Institution I LEFT JOIN InstitutionProduct IP 
         ON IP.InstituationID = I.ID
   GROUP BY i.InstitutionTypeID, i.Institution.ID