SELECT语句用于计算范围总计的问题

时间:2012-08-21 13:13:00

标签: sql sql-server

道歉,如果我的头衔无论如何都会产生误导。难以为我遇到的问题想出一个准确的描述性标题。

我需要从SQL Server 2008 R2中提取一些数据。我只是想使用C#ASP.Net将这些数据输出到GridView。

我只是想看看是否有一种方法可以利用单个查询来提取我需要的所有数据。我会尽力解释我的设置并告诉你我的意思:

我有2个表,示例结构和数据如下。

表:费率

int  nvarchar         nvarchar         decimal nvarchar                  nvarchar                    nvarchar
ID   Location_Code_A  Location_Code_B  Rate    EffectiveRateDate_YYMMDD  TerminationRateDate_YYMMDD  Classificaton
54   123456           456789           400     110801                    999999                      C
55   123456           456789           885.3   110801                    999999                      D
56   123456           456789           901.75  110801                    999999                      T
57   123456           456789           407.5   120501                    120630                      C
58   123456           456789           850     120501                    120630                      D
59   123456           456789           898     120501                    120630                      T
60   123456           987654           325     110801                    999999                      C
61   123456           987654           345.5   120501                    120630                      C

表:跟踪

int nvarchar           nvarchar         nvarchar         nvarchar              nvarchar
ID  TrackCode          Location_Code_A  Location_Code_B  DepartureDate_YYMMDD  Classification
7   124FWDSE48W621543  123456           456789           111025                C
8   124FWDSE48W621544  123456           456789           111025                C
9   124FWDSE48W621545  123456           456789           111025                C
10  124FWDSE48W621546  123456           456789           111025                D
11  124FWDSE48W621547  123456           456789           111025                D
12  124FWDSE48W621548  123456           456789           111028                T
13  124FWDSE48W621549  123456           456789           111025                C
14  124FWDSE48W621550  123456           456789           111125                C
15  124FWDSE48W621551  123456           456789           120525                D
16  124FWDSE48W621552  123456           456789           120526                C
17  124FWDSE48W621553  123456           987654           110927                C
18  124FWDSE48W621554  123456           987654           111027                C
19  124FWDSE48W621555  123456           987654           111027                C
20  124FWDSE48W621556  123456           987654           120514                C
21  124FWDSE48W621557  123456           987654           120515                C
22  124FWDSE48W621558  123456           987654           120515                C

我想要实现的是一个分组查询,它会将Tracking.TrackCode的{​​{1}}计算出来,乘以Tracking.Location_Code来计算总数以及Rates.Rate介于费率的有效/终止日期之间。分类确实在确保使用正确的速率方面起作用,但在实际的最终GridView中却没有。

所以我的GridView结果看起来像:

Tracking.DepartureDate_YYMMDD

您可以看到,当某个费率的出发日期落在Location_A Location_B TotalTrackCodes RateTotal 123456 456789 10 5522.35 123456 987654 6 2011.5 &的两个不同记录之间时,我的问题就出现了。 Rates.EffectiveRateDate。 当发生这种情况时,我想获取最新的费率信息,基本上是最近的Rate.EffectiveRateDate(如果转换为int,则为最高的EffectiveRateDate)。

由于EffectiveRateDates不是日期格式,我只是在查询中将它们转换为int,并将它们作为一种范围而不是用于检查等。似乎工作正常。

是否可以执行单个查询,我可以将其作为DataSet传递给GridView以获得正确的结果?

作为一个注释,我没有构建这些表格/格式等。它们已经由第三方填充,我只是想查询这些表,所以不能自己调整表。

非常感谢您的帮助。

为了节省时间和帮助,请参阅下面的每个表的SQL转储及其数据内容:

Rates.TerminationRateDate

1 个答案:

答案 0 :(得分:1)

select
    Location_Code_A,
    Location_Code_B,
    COUNT(*),
    SUM(rate)
from
(    
    select 
    ROW_NUMBER() over (partition by tracking.id order by rates.effectiveratedate_yymmdd desc) rn,
    tracking.*, 
    convert(decimal(9,5),rates.Rate) rate
from 
    tracking
        inner join  
    rates
        on tracking.Location_Code_A = rates.Location_Code_A
        and tracking.Location_Code_B = rates.Location_Code_B
        and tracking.Classification = rates.Classification
        and tracking.DepartureDate_YYMMDD>=rates.EffectiveRateDate_YYMMDD
) v
where rn=1  
    group by Location_Code_A, Location_Code_B
    order by Location_Code_A, Location_Code_B

产生

123456   456789 10  5929.85000
123456   987654 6   2011.50000