SQL一个表聚合

时间:2010-03-24 20:41:29

标签: sql aggregation

在过去的几天里,我一直试图找到一种方法,从包含我称之为日常计数的表中提取一组非常重要的信息。我有一个表格设置如下。

person|company|prod1|prod2|prod3|gen_date

每家公司都有一个以上的人,每个人可以拥有他们购买的不同产品组合。我一直想弄清楚的是一个SQL语句,它将列出每个公司购买特定产品的人数。所以输出类似于:

Comp ABC | 13 Prod1 |  3 Prod2 | 5 Prod 3
Comp DEF |  2 Prod1 | 15 Prod2 | 0 Prod 3
Comp HIJ |  0 Prod1 |  0 Prod2 | 7 Prod 3 

目前,如果某人未选择产品,则存储的值为NULL

我现在最好的是3个不同的语句,如果单独运行就可以产生这些信息。

SELECT Count(person) as puchases, company 
FROM Sales  WHERE prod1 = '1' and gendate = '3/24/2010' 
Group BY company

2 个答案:

答案 0 :(得分:3)

SELECT      company,
            SUM(COALESCE(prod1, 0)) AS total_prod1,
            SUM(COALESCE(prod2, 0)) AS total_prod2,
            SUM(COALESCE(prod3, 0)) AS total_prod3
FROM        Sales  
WHERE       gendate = '2010-03-24' 
GROUP BY    company

但你绝对应该规范你的表格 - 将其分成4:

  • 公司,
  • 人,
  • 产品,
  • Person_Product_Purchase(购买日期)。

答案 1 :(得分:0)

如果您只想检查该值是否在任何产品字段中,那么只需使用OR运算符即可:

SELECT company, COUNT(person) as purchases
FROM Sales
WHERE (prod1 = '1' OR prod2 = '1' OR prod3 = '1')
AND gendate = '3/24/2010'
GROUP BY company

然而,这将无法很好地执行,并且您将很难使其表现良好,因为您的架构尚未正确规范化。如果可以的话,你应该修改它:

Person (PersonID, CompanyID)
Sales (PurchaseID, PersonID, ProductID, GenDate)

然后这个查询(以及许多其他查询)将更容易编写:

SELECT p.CompanyID, COUNT(*) AS purchases
FROM Person p
INNER JOIN Sales s
    ON s.PersonID = p.PersonID
WHERE s.ProductID = 1
AND s.GenDate = '20100324'
GROUP BY p.CompanyID