2011-04-11 128 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  | 
+--------------------+ 

然后您存储量兑表格中的最颗粒状物体,即“项”。