一条Select语句很难实现的功能 (全部家底30分)(30分)

  • 主题发起人 主题发起人 sw
  • 开始时间 开始时间
S

sw

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:

我最近在做一个数据库程序,数据库用的是 MS SQL Server,
假设有一个表的结构如下:

类别 开始时间 结束时间 单价
A 1999-12-1 0:0:2 1999-12-1 0:0:59 1.5
B 1999-12-1 0:1:0 1999-12-1 0:3:46 1.2
A 1999-12-1 0:4:3 1999-12-1 0:4:5 1.5
C 1999-12-1 0:7:28 1999-12-1 0:9:3 1.0
B 1999-12-1 0:11:2 1999-12-1 0:17:5 1.2

我现在要做的工作就是:将每条记录的价钱算出来,再求出每一类别的总钱数.

每条记录价钱的计算规则如下:
int DataTime_Diff; //是时间差(单位:秒),即:结束时间-开始时间
int Temp; //是临时变量(单位:分钟)
float Per; //是单价
float Money;
if( DataTime_Diff < 6 )
Temp = 0;
else
{
if( DataTime_Diff%60 == 0 )
Temp = DataTime_Diff/60;
else
Temp = DataTime_Diff/60 + 1;
}
Money = Per * Temp;

上面的这些计算似乎用一条Select语句无法完成,我不想将数据都取出来,然后在外面
计算,只想用SQL语言算,然后将结果显示在DBGrid上,请问各位大侠,这该怎么办?(用
"存储过程"也行,能否把具体SQL语句写出来).
 
用 计算字段 试试看
在程序中给计算字段赋上值
 
>>if( DateTime_Diff < 6 )
>> Temp = 0;
>>else
>>{
>> if( DateTime_Diff%60 == 0 )
>> Temp = DateTime_Diff/60;
>> else
>> Temp = DateTime_Diff/60 + 1;
>>}

Temp=((DateTime_Diff div 6)+9) div 10)

写成SQL如下:
<font color=red>update xxx
set temp=((DateTime_Diff / 6)+9) / 10)</font>

实际的需求是<font color=red>小数部分全部舍去</font>
如果M$ SQL Server将浮点数转换成正数时是按<font color=red>四舍五入</font>处理,
那么SQL应该是:
update xxx
set temp=((DateTime_Diff / 6)+9) / 10)-0.5

最终计算价格的SQL:
<font color=red>update xxx
set money=单价 * ((((结束时间-开始时间) / 6)+9) / 10)-0.5)</font>

按类别统计的SQL:
<font color=red>select 类别,sum(money) as money from xxx
group by 类别</font>

如果需要保存到表中,可以用select into
或用insert into ... 再加上面的select语句



<B>我的意见:</B>
这样虽然可以实现,但是很不好,
不如将DateTimeDiff<6和DateTimeDiff>=6的情况写成2个SQL

如下:
<font color=red>update xxx
set money=0
where (结束时间-开始时间)<B></B><6秒

update xxx
set money=单价 * ((((结束时间-开始时间)+59) / 60)-0.5)
where (结束时间-开始时间)<B>>=</B>6秒</font>

 
接受答案了.
 
后退
顶部