2013-07-11 4 views
1

Я с этим соглашался и думал, что у кого-то может быть умный способ решить мою проблему. Я запрашиваю продажи по категориям и должен объединять ВСЕ продажи, если клиент входит в одну категорию продаж. Например:SQL To Aggregate by Category Membership

Cust Category Sale 
A  Pie  3 
A  Cake  5 
B  Pie  4 
C  Cake  8 
C  Limes  1 

В примере, я хочу, чтобы получить общий объем продаж для любого с категорией = «Cake», в результате чего:

Cust Sale 
A  8 
C  9 

Я пишу два запроса (или подзапрос), но задавался вопросом, существует ли прямой подход, который я отсутствовал. Конечно, реальные данные сложнее, но это суть того, что я хочу достичь. Любые мысли о том, как сделать это эффективно без подзапроса?

+1

Какую систему баз данных вы используете? –

ответ

0

Вы можете использовать EXISTS оператора с коррелированных подзапросов в ИНЕКЕ

SELECT t1.Cust, SUM(t1.Sale) AS Sale 
FROM dbo.test134 t1 
WHERE EXISTS (
       SELECT 1 
       FROM dbo.test134 t2 
       WHERE t1.Cust = t2.Cust 
       AND t2.Category = 'Cake' 
      ) 
GROUP BY t1.Cust 

Или агрегатная функция с п OVER для SQLServer2005 +

;WITH cte AS 
(
    SELECT Cust, Category, SUM(Sale) OVER(PARTITION BY Cust) AS Sale 
    FROM dbo.test134 
) 
    SELECT * 
    FROM cte 
    WHERE Category = 'Cake' 

См. Демонстрацию обоих запросов SQLFiddle

0
Select A.Cust, A.Category, B.SumSale 
from Sales A 
Where A.Category like '%Cake%' 
Left Join 
(Select Cust, Category, Sum(Sale) as SumSale 
from Sales 
Group By Cust, Category) B 
On B.Cust = A.Cust 
-1

Что-то вроде:

SELECT Category, Sum(Sales) AS [Sale Totals] 
FROM tblSales 
GROUP BY Category 

EDIT: Это, если вы хотите сгруппировать по всем категориям, а не просто 'торт'. EDIT 2: Тем не менее, если вы хотите только одну категорию, просто добавьте простой:

WHERE Category = 'Cake' 

между ОТ и GROUP BY линий.

+0

-1: Нет, это отклоняет несогласованные строки из 'SUM'. OP только хочет отклонить несоответствие _people_. –

0

Это также возможно с КТР:

WITH cte AS 
(
    SELECT Cust FROM demo 
    WHERE Category = 'Cake' 
) 
SELECT cte.Cust, SUM(Sale) AS Sales FROM demo 
JOIN cte ON cte.Cust = demo.Cust 
GROUP BY cte.Cust