MSSQL Group失败,但没有重复的列名

时间:2017-04-14 22:34:41

标签: sql-server

我知道这个问题一次又一次被问到,但我没有两个相同的列名,但我得到了:

  

Msg 8120,Level 16,State 1,Line 13 Column' dbo.PRODUCT.ProductName'   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

我的ProductId列对于我的dbo.Product表是唯一的,我不确定为什么它会与另一个值混淆。在此图像中,您可以看到dup ProductIds

enter image description here

WITH products AS
(
    SELECT
    *,
    ROW_NUMBER() OVER(ORDER BY p.[ProductName]) AS 'RowNumber'
    FROM dbo.PRODUCT p
    JOIN dbo.Category c ON p.ProductCategoryCode = c.CategoryCode
    JOIN dbo.Supplier s ON p.ProductSupplierCode = s.SupplierCode
    LEFT JOIN dbo.ProductTag pt ON pt.ProductUPC = p.UPC
    LEFT JOIN dbo.Tag t ON pt.ProductTagTagCode = t.TagCode
    GROUP BY p.ProductId
) 
SELECT * 
FROM products 
WHERE RowNumber BETWEEN 0 AND 2;

1 个答案:

答案 0 :(得分:1)

您的错误是因为您正在选择所有表中的所有字段,但您只按一个值进行分组。如果查询返回一个值,则它必须是GROUPED或聚合的(Min,Max,SUM,AVG等)。

如果您只是将产品名称添加到分组中:

GROUP BY p.ProductId, p.ProductName

你仍然会遇到同样的问题(例如)p.ProductCategoryCode,p.ProductSupplierCode,c.CategoryCode等等。

在这种情况下,如果您要查找唯一的行,请使用GROUP BY - 使用DISTINCT(适用于自动返回的所有字段)。请注意,@ bjones仍然是正确的,因为您获得重复的原因 - 您加入的其中一个表可以为每个产品分配多行(例如,产品很多次来自多个供应商。)

要解决此问题,您需要:

  • 确定您需要返回的数据,并仅选择这些列
  • 确定您是否需要汇总任何数据(即总销售额或现有数量),然后:
    • 如果您需要汇总任何值,请使用GROUP BY,或
    • 如果您不需要汇总任何值,请使用DISTINCT