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

时间:2011-04-11 07:01:30

标签: 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.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,项目Dal预付金额为0.请帮我在SQL Server中实现这一点。
提前谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

直觉是你的桌子没有标准化。

我建议把它分成小桌子

可能类似:

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

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

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

然后根据表格中最细粒度的对象存储高级金额,即“项目”。