2011-04-11 172 views
1

最上面的專欄中,我有發票表是這樣的:SQL選擇具有特定條件

Bill Item Qty Weight Rate  Amount Advance 
10001 Dal  1 10.00  70.00 700.00 500.00 
10001 Jeera 2 0.60 1200.00 720.00 500.00 
10002 Bread 1 0.80  50.00 40.00 0.00 
10003 Coffee 1 1.00 700.00 700.00 0.00 
10004 Tea  1 0.70 900.00 700.00 0.00 

請注意,比爾沒有10001,總的進展是隻有500,但它是爲本期特價貨品重複兩次Dal和Jeera。我需要一個SQL顯示針對達爾或Jeera具有最大量這樣只有一個提前量:

Bill Item Qty Weight Rate Amount Advance 
10001 Dal  1 10.00  70.00 700.00 0.00 
10001 Jeera 2 0.60 1200.00 720.00 500.00 
10002 Bread 1 0.80  50.00 40.00 0.00 
10003 Coffee 1 1.00  700.00 700.00 0.00 
10004 Tea  1 0.70  900.00 700.00 0.00 

這裏唯一的變化是沒有票據10001,項目達爾是由0的提前量,請幫忙我在SQL Server中實現這一點。
在此先感謝。

+0

那麼,這個問題是正確的,但結果是你似乎在邏輯上看起來不正確。也許你想在UI部分處理這個問題。 – 2011-04-11 07:07:37

+0

親愛的@Aseem Gautam,正如你所說的,它應該已經被商業邏輯所關注。但我對此沒有任何控制。即使它是瘋狂的,但作爲數據庫開發人員,我必須爲此提供解決方案。感謝您的評論。 – Nagesh 2011-04-11 07:10:11

回答

3
;with cte as 
(
    select *, 
    row_number() over(partition by Bill order by Advance desc) as rn 
    from YourTable 
) 
select 
    C.Bill, 
    C.Item, 
    C.Qty, 
    C.Weight, 
    C.Rate, 
    C.Amount, 
    case C.rn when 1 then C.Advance else 0 end as Advance 
from cte as C 
+0

謝謝,它正在工作。 – Nagesh 2011-04-11 07:18:20

0

直覺是你的表沒有正常化。

我建議分解成更小的表

可能是這樣的:

+- Bills -------+ 
|    | 
| BillNo INT | 
+---------------+ 

+- Items ------------+ 
|     | 
| Item varchar(20) | 
+--------------------+ 

+- BillItems --------+ 
|     | 
| BillNo INT  | 
| Advance MONEY  | 
+--------------------+ 

然後您存儲量兌表格中的最顆粒狀物體,即「項」。