1

我一直在纠结这个问题,并认为有人可能有一个聪明的方法来解决我的问题。我正在按类别成员查询销售额,如果客户是单个销售类别的成员,则需要汇总所有销售额。例如:

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

我一直在写两个查询(或子查询),但想知道是否有我遗漏的直接方法。当然,真实数据更复杂,但这是我想要完成的要点。关于如何在不使用子查询的情况下有效地做到这一点的任何想法?

4

4 回答 4

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
于 2013-07-11T19:29:35.287 回答
0

CTE 也可以:

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
于 2013-07-11T19:32:00.933 回答
0

您可以在 WHERE 子句中将 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

或 SQLServer2005+ 的带有 OVER 子句的聚合函数

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

查看两个查询的演示SQLFiddle

于 2013-07-11T19:35:49.653 回答
-1

就像是:

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

编辑:如果您想按所有类别进行分组,而不仅仅是“蛋糕”。编辑 2:但是,如果您只想要一个类别,只需添加一个简单的:

WHERE Category = 'Cake'

在 FROM 和 GROUP BY 行之间。

于 2013-07-11T19:30:11.710 回答