【问题标题】:SQL Select - Group by along with inner join?SQL Select - 与内部连接一起分组?
【发布时间】:2015-09-04 02:41:43
【问题描述】:

我正在使用以下查询:

SELECT TOP 12 
        INVENTABLE.ITEMNUMBER, 
        INVENTABLE.ITEMNAME1, 
        INVENTABLE.ITEMNAME2, 
        INVENTABLE.W_TILBUD, 
        INVENTABLE.COSTPRICE, 
        INVENTABLE.VENDITEMNUMBER, 
        INVENTABLE.A_PRODUCENT, 
        INVENTABLE.GROUP_, 
        INVENTABLE.A_GROSSISTLAGER, 
        INVENTABLE.SupplementaryUnits 

    FROM INVENTRANS

    INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER 

    WHERE   INVENTRANS.ACCOUNT='xxx'    AND 
            INVENTABLE.W_VISFORSIDE = 0 AND 
            INVENTABLE.W_VISWWW = 1     AND 
            INVENTABLE.BLOCKED = 0 

    ORDER BY INVENTRANS.ROWNUMBER DESC

此查询从一个表 (INVENTRANS) 中选择最后售出的 12 件商品,并从另一个表 (INVENTABLE) 中获取商品信息。它的工作原理应该是这样,除了我想防止多个相同的项目 (INVENTRANS.ITEMNUMBER) 出现在相同的结果中。

我已尝试四处寻找解决方案并尝试了几个带有 DISTINCT 或 GROUP BY 的示例,但我无法使其工作:/

非常感谢任何帮助! :)

解决方案:

;WITH CTE AS (
       SELECT  ROW_NUMBER() OVER (PARTITION BY INVENTRANS.ITEMNUMBER 
                                 ORDER BY INVENTRANS.ROWNUMBER DESC) AS rn,
           INVENTRANS.ITEMNUMBER,
           INVENTRANS.ROWNUMBER,
           INVENTABLE.ITEMNAME1, 
           INVENTABLE.ITEMNAME2, 
           INVENTABLE.W_TILBUD, 
           INVENTABLE.COSTPRICE, 
           INVENTABLE.VENDITEMNUMBER, 
           INVENTABLE.A_PRODUCENT, 
           INVENTABLE.GROUP_, 
           INVENTABLE.A_GROSSISTLAGER, 
           INVENTABLE.SupplementaryUnits 
    FROM INVENTRANS
    INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER 
    WHERE   INVENTRANS.ACCOUNT='xxx'    AND 
            INVENTABLE.W_VISFORSIDE = 0 AND 
            INVENTABLE.W_VISWWW = 1     AND 
            INVENTABLE.BLOCKED = 0 
)
SELECT TOP 12 *
FROM CTE 
WHERE rn = 1
ORDER BY ROWNUMBER DESC

【问题讨论】:

  • 如果一个项目编号有多行,那么只选择其中一个,以便所有 12 行都应该有不同的项目编号?那是对的吗?如果是这样,那么您希望在结果集中包含哪一个倍数。
  • 您能否向我们展示您的数据示例以及您希望查询返回的内容?通常这比在猜测表架构时尝试逆向工程代码更有帮助。
  • 从来没有注意到这里的cmets,抱歉!已找到解决方案,我将使用工作代码编辑我的帖子:)

标签: sql-server select group-by inner-join distinct


【解决方案1】:

您可以使用ROW_NUMBERPARTITION BY 子句来识别重复项:

;WITH CTE AS (
   SELECT  ROW_NUMBER() OVER (PARTITION BY ITEMNUMBER 
                              ORDER BY ROWNUMBER DESC) AS rn,
           INVENTABLE.ITEMNUMBER, 
           INVENTABLE.ITEMNAME1, 
           INVENTABLE.ITEMNAME2, 
           INVENTABLE.W_TILBUD, 
           INVENTABLE.COSTPRICE, 
           INVENTABLE.VENDITEMNUMBER, 
           INVENTABLE.A_PRODUCENT, 
           INVENTABLE.GROUP_, 
           INVENTABLE.A_GROSSISTLAGER, 
           INVENTABLE.SupplementaryUnits 
    FROM INVENTRANS
    INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER 
    WHERE   INVENTRANS.ACCOUNT='xxx'    AND 
            INVENTABLE.W_VISFORSIDE = 0 AND 
            INVENTABLE.W_VISWWW = 1     AND 
            INVENTABLE.BLOCKED = 0 
)
SELECT TOP 12 *
FROM CTE 
WHERE rn = 1
ORDER BY ROWNUMBER DESC

CTE 返回的带有rn > 1 的任何记录都是重复的,因此会被WHERE 子句过滤掉。过滤掉的重复记录是具有最低ROWNUMBER 值的记录。您可以更改ROW_NUMBERORDER BY 子句,以任意方式更改此标准。

【讨论】:

  • 稍微调整一下,我就可以正常工作了:D 非常感谢!
【解决方案2】:

您应该使用GROUP BY INVENTRANS.ITEMNUMBER(不是在您的内部连接中,而是在“主查询”中)这将删除所有ITEMNUMBER.. DISINCT 只删除完全相同的集合。

SELECT TOP 12 
        INVENTABLE.ITEMNUMBER, 
        INVENTABLE.ITEMNAME1, 
        INVENTABLE.ITEMNAME2, 
        INVENTABLE.W_TILBUD, 
        INVENTABLE.COSTPRICE, 
        INVENTABLE.VENDITEMNUMBER, 
        INVENTABLE.A_PRODUCENT, 
        INVENTABLE.GROUP_, 
        INVENTABLE.A_GROSSISTLAGER, 
        INVENTABLE.SupplementaryUnits 
FROM INVENTRANS

INNER JOIN INVENTABLE ON INVENTABLE.ITEMNUMBER=INVENTRANS.ITEMNUMBER 

WHERE   INVENTRANS.ACCOUNT='xxx'    AND 
        INVENTABLE.W_VISFORSIDE = 0 AND 
        INVENTABLE.W_VISWWW = 1     AND 
        INVENTABLE.BLOCKED = 0 

GROUP BY INVENTRANS.ITEMNUMBER

ORDER BY INVENTRANS.ROWNUMBER DESC

【讨论】:

  • 您希望我将其放在查询的哪个位置?我试过了,但可能放错地方了,如果这很重要?
  • 除非该列在聚合函数中,否则您需要按您选择的所有列进行分组。
  • 这给了我以下错误:“列 'INVENTABLE.ITEMNUMBER' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”
  • INVENTRANS.ITEMNUMBER 不是 INVENTABLE.ITEMNUMBER,因为你想对它们进行分组 ;)
  • 这就是我所说的:P 如果我将我选择的列也更改为“INVENTRANS.ITEMNUMBER”,它也会给“INVENTABLE.ITEMNAME1”同样的错误 oo 还有@hello_world,你能解释一下吗?我不确定我是否理解:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2012-07-19
  • 2021-12-27
  • 2015-08-06
相关资源
最近更新 更多