如何在没有可在 SQL 上分组的属性的表中进行分组
Posted
技术标签:
【中文标题】如何在没有可在 SQL 上分组的属性的表中进行分组【英文标题】:How to group by within a table that doesn't have attributes that can be grouped on SQL 【发布时间】:2013-02-20 09:14:06 【问题描述】:我有以下表格:
订单 产品 OrderDetails 作为联合表。我还有一个与产品相关联的类别表; CategoryID 是 Products 的外部表。
我正在尝试获取一个表格,其中包含 1997 年、1998 年之间的订单年份、季度、以 C 字母开头的类别名称和销售(UDF)。这是我尝试过的:
Select YEAR(o.OrderDate) AS "Year", DATENAME(Quarter, o.OrderDate) AS "Qtr",
c.CategoryName,
dbo.SaleAfterDiscount(od.UnitPrice, od.Quantity, od.Discount) AS "Sale"
From Orders o, [Order Details] od, Categories c, Products p
WHERE (YEAR(o.OrderDate)='1997'OR YEAR(o.OrderDate)='1998')
AND c.CategoryName LIKE 'c%'
AND od.OrderID = o.OrderID
AND od.ProductID = p.ProductID
AND c.CategoryID = p.CategoryID
但我得到了很多结果。如何对它们进行分组或修复查询以获得正确答案?
【问题讨论】:
那么到底出了什么问题?您将获得 1997 年和 1998 年订单的所有行条目......正如预期和描述的那样 @gbn 当我运行这个查询时,我得到了 452 行,而我应该只得到 12 条记录。我必须添加“不同”吗?因为我没有看到任何可以将答案分组的属性 尝试 DISTINCT。会发生什么? 如果你想要的话,你可以按表达式分组:group by YEAR(o.OrderDate), DATENAME(Quarter, o.OrderDate)
和 sum Sale
。
@Gbn 行数下降到 423。
【参考方案1】:
-
使用显式 JOIN
不要在列上使用函数
GROUP BY 所有非聚合列
像这样:
Select
YEAR(o.OrderDate) AS "Year",
DATENAME(Quarter, o.OrderDate) AS "Qtr",
c.CategoryName,
SUM(dbo.SaleAfterDiscount(od.UnitPrice, od.Quantity, od.Discount)) AS "SaleSum"
From
Orders o
JOIN
[Order Details] od ON od.OrderID=o.OrderID
JOIN
Products p ON od.ProductID=p.ProductID
JOIN
Categories c ON c.CategoryID=p.CategoryID
WHERE
o.OrderDate >= '19970101' AND o.OrderDate < '19990101'
AND
c.CategoryName LIKE 'c%'
GROUP BY
YEAR(o.OrderDate),
DATENAME(Quarter, o.OrderDate),
c.CategoryName;
【讨论】:
哎呀!我只需要 Sum 在我的函数之前。这非常完美。非常感谢。以上是关于如何在没有可在 SQL 上分组的属性的表中进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?