根据列值过滤行

时间:2013-09-06 17:49:37

标签: sql sql-server

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

我还有一个名为 AssetBookTable 的表格,其中存储了两个字段 BookId CurrentOperationsTax

另一个表 AssetBook ,将 AssetId BookId 存储为foriegn键。

  

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

这是我现在得到的, This is so far I have achieved

这就是我想要的: This is what I want to achieve

**

逻辑是我想要每个AssetId只有一个BookId,它对CurrentOperationsTax字段有Current / Operation / Tax。

**

这是迄今为止写的SQL小提琴:

SQLFiddle

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
相关问题