SQL选择具有特定条件的最顶端列

SQL选择具有特定条件的最顶端列,sql,sql-server-2005,Sql,Sql Server 2005,我有这样一个发票表: 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.0

我有这样一个发票表:

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来显示Dal或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中实现这一点。

提前谢谢。

直觉是您的桌子没有正常化

;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
我建议把它分成几张小桌子

可能是这样的:

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

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

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

然后,根据表中最细粒度的对象(即“项”)存储预付金额

这个问题是正确的,但结果是你在逻辑上似乎不正确。亲爱的@Aseem Gautam,正如您正确地说的,它应该由业务逻辑来处理。但我对此没有任何控制权。尽管这很疯狂,但作为一名数据库开发人员,我必须给出解决方案。谢谢你的评论。