道歉,如果我的头衔无论如何都会产生误导。难以为我遇到的问题想出一个准确的描述性标题。
我需要从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
答案 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