2

我有一个名为AssetTable存储AssetId的表

我有另一个表AssetBookTable,它存储两个字段BookIdCurrentOperationsTax

另一个将AssetIdBookIdAssetBook存储为外键的表。

现在,我有一种情况,我必须根据 AssetBookTable.CurrentOperationsTax 过滤记录

这就是我现在得到的, 这是到目前为止我已经实现的

这就是我想要的: 这就是我想要实现的

**

逻辑是,我只希望每个 AssetId 有一个 BookId,该 BookId 具有 CurrentOperationsTax 字段的 Current/Operation/Tax。

**

这是到目前为止编写的 SQL 小提琴:

SQLFiddle

任何帮助是极大的赞赏。

4

2 回答 2

1

您可以简单地删除GROUP BY BookID. 但是当然你需要以某种方式聚合 BookID。这里使用 MIN() 函数:

SELECT
   ab.AssetId
  ,MIN(ab.BookId) as BookID
  ,abt.CuurentOperationsTax
FROM
 AssetBook ab
JOIN AssetTable at ON at.AssetId = ab.AssetId
JOIN AssetBookTable abt ON abt.BookId = ab.BookId
GROUP BY 
   ab.AssetId
  ,abt.CuurentOperationsTax

http://sqlfiddle.com/#!6/e3477/42

于 2013-09-06T18:02:43.303 回答
1

我更喜欢使用 ROW_NUMBER 方法。它确实需要使用子查询。总之,它按 CuurentOperationsTax 编号对记录进行分组,按书籍 ID 排序,并为每个分组提供行号。然后在外部选择中,我过滤掉每个分组我想要多少。在这个例子中只有 1。

SELECT   AssetId
        ,BookId
        ,CuurentOperationsTax
        ,RowNum
FROM   (
        SELECT
           ab.AssetId
          ,ab.BookId
          ,abt.CuurentOperationsTax
          ,ROW_NUMBER() OVER(PARTITION BY abt.CuurentOperationsTax ORDER BY ab.BookId) AS RowNum
        FROM
         AssetBook ab
        JOIN AssetTable AT ON AT.AssetId = ab.AssetId
        JOIN AssetBookTable abt ON abt.BookId = ab.BookId
      ) AS b
WHERE b.RowNum = 1
于 2013-09-06T20:14:49.460 回答