SQL агрегация одной таблицы - PullRequest
0 голосов
/ 24 марта 2010

В последние несколько дней я пытался найти способ извлечь очень важный набор информации из таблицы, содержащей то, что я называю ежедневными счетами. У меня есть таблица, которая настроена следующим образом.

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 ]

3 голосов
/ 24 марта 2010
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 (с указанием даты покупки).
0 голосов
/ 24 марта 2010

Если вы просто хотите проверить, находится ли значение в каком-либо из полей продукта, это просто делается с помощью оператора 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
...