比較難的SQL語句 ( 积分: 100 )

  • 主题发起人 主题发起人 漂流的雲
  • 开始时间 开始时间

漂流的雲

Unregistered / Unconfirmed
GUEST, unregistred user!
結果如下:
名稱 日期 數量 審核 累計(結果)
A 2007-10-1 10 Y 0
A 2007-10-5 20 Y 10
A 2007-10-13 8 N 30
A 2007-10-15 5 Y 30
A 2007-10-20 30 Y 35

累計這欄如何跟據日期和審核進行漚總計算
只要有一個改動,所有的數據重新計算。想了好久還是沒有結果,請大家幫忙看看
 
用触发器吧
 
这些你是想在程序中实现还是在数据厍中实现..
 
用SQL語句實現,用更新語句行不,可以在D裡詷用的就行
 
我的意思是说.你的变化是在程序中变化时重新计算,还是数中只要变化就去重新计算?如果要是在操作程序时变化的而去重新计算.那就在操作时去刷新一下,要是后者.则用触发器吧.
 
數量這個是在程序中改的。所以還得在改的同時把數據重新計算一次,
還是用程序來控制吧,觸發器占資源
 
在程序中再计算.那就好弄了.当数据变化时刷新一下.就可以.当存储时再保存数据.就是了.
 
怎麼寫SQL???請指點
 
function sums(strkey: string ;dates: TDateTime): integer;
var
strSql:string;
begin
strSql := 'select sum(數量)as nums from tables where 名稱=strKey
and 日期 > datas and 審核='Y' ';
query1.close;
query1.sql.clear;
query1.sql.add();
query1.open;
Result := query1.FieldByName('nums').asinteger;
end;

当你数据变化时用这个函数刷新一下.传进去 [名稱 日期] 因为你的名称可能不是一样的,日期,我看了你的累计好像是当天以前的累加.所以今天的就去掉了.是用'>'号,
 
你這個只是改一條數據
如果前面的數據有修改,後面的匯總應該都要改的。
這個很麻煩的。。
 
select t1.名稱,t1.日期,t1.數量,t1.審核,
((select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱)-t1.數量) as 累計
from 表名 t1
 
不太明白是怎么回事
 
你如果用的是大型数据库可以定义计算函数来完成,下面完成某个名称,某个月中的日累计
create function mySum(myName varchar(50),myDate Varchar(10))
begin
select sum(數量) from tables where 名稱=myName and 日期 < myDate and 日期>=substring(myDate,1,7)+'-01' and 審核='Y'
end

使用时:
select *,mySum(名稱,substring(日期,1,7)) as 累计 from tables

绝对能完成你的任务,累计不必建立物理字段。

又修改了一下
 
謝謝:kaida,謝謝大家,現采用kaida的語句,但未審核的沒有數據。怎樣才能得到比它的日期小的並審核的數據匯總,這個要怎麼做
select t1.名稱,t1.日期,t1.數量,t1.審核,
((select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱 and t2.審核='Y' and t1.審核='Y' )-t1.數量) as 累計
from 表名 t1
結果如下:
名稱 日期 數量 審核 累計(結果)
A 2007-10-1 10 Y 0
A 2007-10-5 20 Y 10
A 2007-10-13 8 N
A 2007-10-15 5 N
A 2007-10-20 30 Y 30
如何進一步得到以下結果
名稱 日期 數量 審核 累計(結果)
A 2007-10-1 10 Y 0
A 2007-10-5 20 Y 10
A 2007-10-13 8 N 30
A 2007-10-15 5 N 30
A 2007-10-20 30 Y 30
 
看不懂你写的字.下次问问题用简体.
 
谢谢:kaida,谢谢大家,现采用kaida的语句,但未审核的没有数据。怎样才能得到比它的日期小的并审核的数据汇总,这个要怎么做
select t1.名称,t1.日期,t1.数量,t1.审核,
((select sum(数量) from 表名 t2 where t2.日期<=t1.日期 and t2.名称=t1.名称 and t2.审核='Y' and t1.审核='Y' )-t1.数量) as 累计
from 表名 t1
结果如下:
名称 日期 数量 审核 累计(结果)
A 2007-10-1 10 Y 0
A 2007-10-5 20 Y 10
A 2007-10-13 8 N
A 2007-10-15 5 N
A 2007-10-20 30 Y 30
如何进一步得到以下结果
名称 日期 数量 审核 累计(结果)
A 2007-10-1 10 Y 0
A 2007-10-5 20 Y 10
A 2007-10-13 8 N 30
A 2007-10-15 5 N 30
A 2007-10-20 30 Y 30
 
select t1.名稱,t1.日期,t1.數量,t1.審核,
case t1.審核
when 'Y' then
((select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱 and t2.審核='Y' and t1.審核='Y' )-t1.數量)
else (select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱 and t2.審核='Y' and t1.審核='Y' )
end as 累計
from 表名 t1
 
如果存在相同日期的就會計算錯誤的結果
select t1.名稱,t1.日期,t1.數量,t1.審核,
case t1.審核
when 'Y' then
((select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱 and t2.審核='Y' and t1.審核='Y' GROUP BY t2.名稱,t2.日期 )-t1.數量)
else (select sum(數量) from 表名 t2 where t2.日期<=t1.日期 and t2.名稱=t1.名稱 and t2.審核='Y' GROUP BY t2.名稱,t2.日期 )
end as 累計
from 表名 t1
改成這樣SQL語句就有錯誤。。
 
如果存在相同日期,你的顺序(那条在前,那条在后)如何确定呢?不要告诉我用物理顺序。
 
相同的日期,累計結果應該是一樣的。
如下
名稱 日期 數量 審核 累計(結果)
A 2007-10-1 10 Y 0
A 2007-10-13 20 Y 10
A 2007-10-13 8 Y 10
A 2007-10-15 5 N 38
A 2007-10-18 5 Y 38
A 2007-10-20 30 Y 43
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
880
import
I
I
回复
0
查看
763
import
I
后退
顶部