如何在没有可在 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 上分组的属性的表中进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何对具有多列的表中的数据进行分组[重复]

如何从相关表中对 SQL 中的结果进行分组?

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

如何在 SQL 中进行转换和分组

使用 SQL 对具有共同状态的连续项目进行分组(包括虚拟数据)