从多个表中获取计数

时间:2011-07-13 11:23:59

标签: sql sql-server tsql

  

可能重复:
  Getting count from sql tables.

我之前已经提到了相同的数据和表格,但这次要求略有不同。所以请不要投票给它关闭或者投票。 我有4个表,如图3中的表所示,另一个是tbl_Company: enter image description here

现在在map表中,其余三个表的主键。同样在表子类别中,我们有各种类别的子项,标有类别ID 2,但如果您在地图中看到我们只有4项类别2,并且有两个独特的公司7和8。

所以我想要的是在选择一个类别时显示,其所有子类别将与公司数量一起列出。就像在地图表中一样,cat id 2有4行并且有12个子猫(实际上在表中它是44)。所以我的输出将有所有44 subcat与显示4子猫有公司和休息0.像这样的东西

SubCategoryName  TotalCompanies
---------------  --------------
Badges, Emblems  0
Fashion scarves  1
…                …

等等。

我使用了这个查询

SELECT     tbl_SubCategory.Name AS SubCategoryName, TotalCompanies = (Select COUNT(CompanyId) From tbl_Company_Category_Map WHERE CategoryId=2 )
FROM       tbl_Category RIGHT JOIN
                      tbl_SubCategory ON tbl_Category.Id = tbl_SubCategory.CategoryId
                      LEFT JOIN 

                      tbl_Company_Category_Map ON tbl_SubCategory.Id = tbl_Company_Category_Map.SUbCategoryId 
WHERE     (tbl_Category.Id = 2)
Group By tbl_SubCategory.Name
ORDER BY tbl_SubCategory.Name

但它返回了我所有44个子类别的4家公司,因为我的实际产量应该只有4行应该有公司并且休息0

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用相关查询?相关查询是在主查询中使用子查询外部的列的值的子查询。它看起来像这样:

      SELECT     
        tbl_SubCategory.Name AS SubCategoryName, 
        TotalCompanies = (
          Select 
            COUNT(CompanyId) 
          From 
            tbl_Company_Category_Map 
          WHERE 
            CategoryId = tbl_Category.Id) -- Here, it will count using the current cat_id
      FROM       
        tbl_Category 
          RIGHT JOIN tbl_SubCategory 
            ON  tbl_Category.Id = tbl_SubCategory.CategoryId
          LEFT JOIN tbl_Company_Category_Map 

            ON tbl_SubCategory.Id = tbl_Company_Category_Map.SUbCategoryId  
      WHERE     
        (tbl_Category.Id = 2) 
      Group By 
        tbl_SubCategory.Name 
      ORDER BY 
        tbl_SubCategory.Name 

答案 1 :(得分:1)

您正在寻找一个有汇总的小组:

    SELECT     tbl_SubCategory.Name, tbl_Company_Category_Map.Company_ID,count(tbl_Category.Id)
    FROM       tbl_Category 
    RIGHT JOIN tbl_SubCategory ON tbl_Category.Id = tbl_SubCategory.CategoryId
   LEFT JOIN  tbl_Company_Category_Map ON tbl_SubCategory.Id = tbl_Company_Category_Map.SUbCategoryId 
    WHERE     (tbl_Category.Id = 2)
    Group By Rollup(tbl_SubCategory.Name,tbl_Company_Category_Map.Company_ID)
    ORDER BY tbl_SubCategory.Name

关于结果集的更多信息,只有子猫的计数对于公司ID将为空。

答案 2 :(得分:1)

此特定查询似乎不需要tbl_Category表:

SELECT
  SubCategoryName = tbl_SubCategory.Name,
  TotalCompanies  = COUNT(DISTINCT ccm.CompanyId)
FROM tbl_SubCategory sc
  LEFT JOIN tbl_Company_Category_Map ccm ON sc.Id = ccm.SubCategoryId
WHERE sc.CategoryId = 2