2011-09-21 58 views
0

我困惑於相當混亂的查詢。查詢選擇屬於未返回用戶的每個產品的最後一個訂單(條目)

假設我有一個ProductLending表,用於跟蹤每個用戶借用的產品,更新的時間,是否返回等等。給定一個用戶,我希望能夠選擇所有仍然存在的獨特產品與用戶。

表例如:

userid DateRenewed ProductId isReturned 
```````````````````````````````````````````````` 
1  2011-07-21  15   0 
1  2011-08-20  16   0 
1  2011-09-21  15   1 
2  2011-09-21  17   0 
1  2011-09-21  15   0 

這是一個模擬了很抱歉,如果它是不準確的。

現在,在userId = 1的情況下,我想選擇僅返回的唯一productId,但是與用戶一起使用。所以這應該給我15,16作爲結果,因爲即使15返回,它被重新借用。如果我們刪除最後一行,那麼結果只會是16,因爲用戶只有他16。

我嘗試按dateRenewed排序並選擇top 1,但它完全做了別的..我該如何構建一個查詢?

回答

2

如果產品不是由用戶返回,然後買產品的總和必須大於退回產品的總和

SELECT userid,ProductId FROM <table> 
GROUP BY userid,ProductId HAVING SUM(CASE CAST(isReturned AS INT) WHEN 0 THEN 1 ELSE 0 END)-SUM(CAST(isReturned AS INT))>0 
+1

我喜歡這一點,唯一的問題是如果IsReturned是一個位列(我期望它是)。如果你的列是位的,你將不得不將你的查詢改爲...- SUM(CAST(isReturned AS INT))> 0 –

+0

當然。不知道MSSQL2008的規格,但SQL2005不支持真正的位列,afaik – rabudde

+0

嗨,這似乎很奇怪,你的意思是說,「購買產品的總和必須比退貨產品的總和還要多 - **爲每個產品**「?因爲用戶可以借用5個產品,然後返回所有5個產品,所以現在,上面的假設是錯誤的,它將返回零行(這是我想要的) - 我是否理解正確?對不起,但這很混亂! – LocustHorde

1

試試這個:

;WITH qry AS 
(
    SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY userID, ProductID ORDER BY DateRenewed DESC) rn 
    FROM YourTable 
) 
SELECT * 
    FROM qry 
WHERE rn = 1 AND isReturned = 0; 
+0

嗨,我實際上將不得不將它轉換成Criterion api(nhibernate) - 只是想知道這是否可能! – LocustHorde

0
select distinct ProductId 
from TABLE_NAME t1 
where UserId= @UserId 
and IsReturned = 0 
and not exists 
(
    select * 
    from TABLE_NAME t2 
    where t2.UserId = t1.UserId 
    and t2.ProductId = t1.ProductId 
    and t2.IsReturned = 1 
    and t2.DateRenewed > t1.DateRenewed 
) 
相關問題