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