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,正如您正确地说的,它应该由业务逻辑来处理。但我对此没有任何控制权。尽管这很疯狂,但作为一名数据库开发人员,我必须给出解决方案。谢谢你的评论。