求一统计SQL或者触发器 在线等 得到结果马上结贴

wang520d 2008-07-09 05:28:27
有订单详细信息表T_Order_Detail
订单编号 数量 价格 优惠数量 优惠价格 运费 订单总金额 是否搭销 是否赠品
DD001 1 10 2 5 5 25 是 否
DD001 1 10 2 5 5 25 否 是
DD001 1 30 2 5 5 45 否 否
DD002 1 10 2 5 5 25 否 否
DD002 1 10 2 5 5 25 否 是
DD002 1 20 2 5 5 35 否 否
想得到某个订单的订单详细信息 如:下面是订单表T_Order_Info
订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额(不包含运费) 赠品总数量 总金额
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

如果能用触发器实现那最好 就是当有订单详细信息生成就自动统计出订单表的信息,如果不能就用SQL统计也行
...全文
318 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiguo2008 2008-07-09
  • 打赏
  • 举报
回复
跟班,学习
zhiguo2008 2008-07-09
  • 打赏
  • 举报
回复
.....
zhiguo2008 2008-07-09
  • 打赏
  • 举报
回复
....
rhq12345 2008-07-09
  • 打赏
  • 举报
回复

SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 1 else 0 end) AS 搭销总数量 ,
SUM(case when 是否搭销='是' then 价格*优惠数量 else 0 end) AS 搭销总金额(不包含运费),
SUM(case when 是否赠品='是' then 1 else 0 end) AS 赠品总数量 ,
SUM(订单总金额) AS 总金额
FROM TB
GROUP BY 订单编号
青锋-SS 2008-07-09
  • 打赏
  • 举报
回复
使用视图的例子.

create table T_Order_Detail(订单编号 varchar(20),数量 int,价格 int,优惠数量 int,优惠价格 int,运费 int,订单总金额 int,是否搭销 varchar(20),是否赠品 varchar(20));
go
create View v_Order_Info
as
select 订单编号,sum(数量) as '总数量',sum(价格) as '总价格',sum(优惠数量) as '总优惠数量',sum(优惠价格*优惠数量) as '总优惠价格',sum(运费) as '总运费',sum(case 是否搭销 when '是' then 1 else 0 end) as '搭销总数量',sum(case 是否搭销 when '是' then 订单总金额-优惠价格 else 0 end) as '搭销总金额不包含运费',sum(case 是否赠品 when '是' then 1 else 0 end) as '赠品总数',sum(价格+优惠价格*优惠数量+运费) as '总金额' from t_order_detail group by 订单编号
go
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'是','否')
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD001',1,30,2,5,5,45,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD002',1,20,2,5,5,35,'否','否')
go
select * from T_Order_Detail;
select * from v_Order_Info
go
drop view v_Order_Info;
drop table T_Order_Detail;
go

--结果
订单编号 数量 价格 优惠数量 优惠价格 运费 订单总金额 是否搭销 是否赠品
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- -------------------- --------------------
DD001 1 10 2 5 5 25 是 否
DD001 1 10 2 5 5 25 否 是
DD001 1 30 2 5 5 45 否 否
DD002 1 10 2 5 5 25 否 否
DD002 1 10 2 5 5 25 否 是
DD002 1 20 2 5 5 35 否 否

(6 行受影响)

订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额不包含运费 赠品总数 总金额
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

(2 行受影响)
青锋-SS 2008-07-09
  • 打赏
  • 举报
回复
应该是用视图好,用触发器牵扯到对数据的更新,而用视图只是查询数据,相对来说IO操作要少许多,当然效率也相对提高了.
wang520d 2008-07-09
  • 打赏
  • 举报
回复
今天下班啦 明天结贴 。。。请高手给点意见 用触发器好还是视图好???
wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 sdhylj 的回复:]
其实如果你用视图的话,订单表就可以用视图来替代.
[/Quote]

有道理。。。可以考虑 再请教下。。如果我用视图数据量大了的话 我该怎么建视图索引或者有什么好的办法优化
青锋-SS 2008-07-09
  • 打赏
  • 举报
回复
其实如果你用视图的话,订单表就可以用视图来替代.
wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 kuangdp 的回复:]
引用 18 楼 wang520d 的回复:
引用 16 楼 hanjs 的回复:
引用 5 楼 kuangdp 的回复:
SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 1 else 0 end) AS 搭销总数量 ,

[/Quote]

视图不需要你更新的
==========
可是用试图实际上只是把结果运算出来了 并没有去更新订单表
kuangdp 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wang520d 的回复:]
引用 16 楼 hanjs 的回复:
引用 5 楼 kuangdp 的回复:
SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 1 else 0 end) AS 搭销总数量 ,
SUM(case when 是否搭销='是' t…
[/Quote]


我的意思是如果能用触发器那就省去我再往订单表去更新订单统计信息了

视图不需要你更新的
青锋-SS 2008-07-09
  • 打赏
  • 举报
回复
这个是用触发器的.

create table T_Order_Detail(订单编号 varchar(20),数量 int,价格 int,优惠数量 int,优惠价格 int,运费 int,订单总金额 int,是否搭销 varchar(20),是否赠品 varchar(20));
go
create table T_Order_Info(订单编号 varchar(20),总数量 int,总价格 int,总优惠数量 int,总优惠价格 int,总运费 int,搭销总数量 int,搭销总金额不包含运费 int,赠品总数量 int,总金额 int);
go
create trigger t_1
on t_order_detail
for insert,update,delete
as
delete from t_order_info where 订单编号=(select 订单编号 from inserted)
insert into t_order_info select 订单编号,sum(数量) as '总数量',sum(价格) as '总价格',sum(优惠数量) as '总优惠数量',sum(优惠价格*优惠数量) as '总优惠价格',sum(运费) as '总运费',sum(case 是否搭销 when '是' then 1 else 0 end) as '搭销总数量',sum(case 是否搭销 when '是' then 订单总金额-优惠价格 else 0 end) as '搭销总金额不包含运费',sum(case 是否赠品 when '是' then 1 else 0 end) as '赠品总数',sum(价格+优惠价格*优惠数量+运费) from t_order_detail where 订单编号=(select 订单编号 from inserted) group by 订单编号
go
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'是','否')
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD001',1,30,2,5,5,45,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD002',1,20,2,5,5,35,'否','否')
go
--insert into T_Order_Info values('DD001',3,50,6,30,15,1,20,1,95)
--insert into T_Order_Info values('DD002',3,40,6,30,15,0,0,1,85)
--go
select * from T_Order_Info
select * from T_Order_Detail;
select 订单编号,sum(数量) as '总数量',sum(价格) as '总价格',sum(优惠数量) as '总优惠数量',sum(优惠价格*优惠数量) as '总优惠价格',sum(运费) as '总运费',sum(case 是否搭销 when '是' then 1 else 0 end) as '搭销总数量',sum(case 是否搭销 when '是' then 订单总金额-优惠价格 else 0 end) as '搭销总金额不包含运费',sum(case 是否赠品 when '是' then 1 else 0 end) as '赠品总数',sum(价格+优惠价格*优惠数量+运费) from t_order_detail group by 订单编号
go
drop trigger t_1;
go
drop table T_Order_Info,T_Order_Detail;
go

--结果
订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额不包含运费 赠品总数量 总金额
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

(2 行受影响)

订单编号 数量 价格 优惠数量 优惠价格 运费 订单总金额 是否搭销 是否赠品
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- -------------------- --------------------
DD001 1 10 2 5 5 25 是 否
DD001 1 10 2 5 5 25 否 是
DD001 1 30 2 5 5 45 否 否
DD002 1 10 2 5 5 25 否 否
DD002 1 10 2 5 5 25 否 是
DD002 1 20 2 5 5 35 否 否

(6 行受影响)

订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额不包含运费 赠品总数
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

(2 行受影响)

-狙击手- 2008-07-09
  • 打赏
  • 举报
回复
。。。
wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Haiwer 的回复:]
是不是
总优惠价格=sum(优惠价格*优惠数量)
[/Quote]
对就是这样
昵称被占用了 2008-07-09
  • 打赏
  • 举报
回复
触发器(算法可能理解错误,自己多检查):

CREATE TRIGGER TR_T_Order_Detail
ON T_Order_Detail
FOR INSERT,DELETE,UPDATE
AS


SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格*数量) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格*优惠数量) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 数量 else 0 end) AS 搭销总数量 ,
SUM(case when 是否搭销='是' then 数量*价格+优惠数量*优惠价格 else 0 end) AS [搭销总金额(不包含运费)],
SUM(case when 是否赠品='是' then 数量 else 0 end) AS 赠品总数量 ,
SUM(订单总金额) AS 总金额
into #t
FROM (
select 订单编号,数量,价格,优惠数量,优惠价格,运费,订单总金额,是否搭销,是否赠品
from inserted
union all
select 订单编号,-数量,价格,-优惠数量,优惠价格-,运费,-订单总金额,是否搭销,是否赠品
from deleted
) as t
GROUP BY 订单编号

update o set
总数量 =o.总数量+t.总数量,
总价格 =o.总价格+t.总价格,
总优惠价格 =o.总优惠价格+t.总优惠价格,
总运费 =o.总运费+t.总运费,
搭销总数量 =o.搭销总数量+t.搭销总数量,
[搭销总金额(不包含运费)] =o.[搭销总金额(不包含运费)]+t.[搭销总金额(不包含运费)],
赠品总数量 =o.赠品总数量+t.赠品总数量,
总金额 =o.总金额+t.总金额
from T_Order_Info o,#t t
where o.订单编号 =t.订单编号

insert T_Order_Info (
订单编号 ,
总数量 ,
总价格 ,
总优惠价格 ,
总运费 ,
搭销总数量 ,
[搭销总金额(不包含运费)] ,
赠品总数量 ,
总金额 )
select
订单编号 ,
总数量 ,
总价格 ,
总优惠价格 ,
总运费 ,
搭销总数量 ,
[搭销总金额(不包含运费)] ,
赠品总数量 ,
总金额
from #t t
where not exists (
select 1
from T_Order_Info o
where o.订单编号 =t.订单编号
)
wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hanjs 的回复:]
引用 5 楼 kuangdp 的回复:
SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 1 else 0 end) AS 搭销总数量 ,
SUM(case when 是否搭销='是' then 价格*优惠数量 else 0 en…
[/Quote]

我的意思是如果能用触发器那就省去我再往订单表去更新订单统计信息了
wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sdhylj 的回复:]
难道是这样?

SQL code
create table T_Order_Detail(订单编号 varchar(20),数量 int,价格 int,优惠数量 int,优惠价格 int,运费 int,订单总金额 int,是否搭销 varchar(20),是否赠品 varchar(20));
go
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'是','否')
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD001',1,30,2,5,5,45,'否','否')
in…
[/Quote]
结果就是这样
hanjs 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kuangdp 的回复:]
SELECT 订单编号 ,SUM(数量) AS 总数量 ,
SUM(价格) AS 总价格 ,
SUM(优惠数量) AS 总优惠数量,
SUM(优惠价格) AS 总优惠价格,
SUM(运费) AS 总运费 ,
SUM(case when 是否搭销='是' then 1 else 0 end) AS 搭销总数量 ,
SUM(case when 是否搭销='是' then 价格*优惠数量 else 0 end) AS 搭销总金额(不包含运费…
[/Quote]


这个就可以吧,lz想要啥?不用触发器好
青锋-SS 2008-07-09
  • 打赏
  • 举报
回复
难道是这样?

create table T_Order_Detail(订单编号 varchar(20),数量 int,价格 int,优惠数量 int,优惠价格 int,运费 int,订单总金额 int,是否搭销 varchar(20),是否赠品 varchar(20));
go
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'是','否')
insert into T_Order_Detail values('DD001',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD001',1,30,2,5,5,45,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','否')
insert into T_Order_Detail values('DD002',1,10,2,5,5,25,'否','是')
insert into T_Order_Detail values('DD002',1,20,2,5,5,35,'否','否')
go
create table T_Order_Info(订单编号 varchar(20),总数量 int,总价格 int,总优惠数量 int,总优惠价格 int,总运费 int,搭销总数量 int,搭销总金额不包含运费 int,赠品总数量 int,总金额 int);
go
insert into T_Order_Info values('DD001',3,50,6,30,15,1,20,1,95)
insert into T_Order_Info values('DD002',3,40,6,30,15,0,0,1,85)
go
select * from T_Order_Info
select * from T_Order_Detail;
select 订单编号,sum(数量) as '总数量',sum(价格) as '总价格',sum(优惠数量) as '总优惠数量',sum(优惠价格*优惠数量) as '总优惠价格',sum(运费) as '总运费',sum(case 是否搭销 when '是' then 1 else 0 end) as '搭销总数量',sum(case 是否搭销 when '是' then 订单总金额-优惠价格 else 0 end) as '搭销总金额不包含运费',sum(case 是否赠品 when '是' then 1 else 0 end) as '赠品总数',sum(价格+优惠价格*优惠数量+运费) from t_order_detail group by 订单编号
go
drop table T_Order_Info,T_Order_Detail;
go

--结果

订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额不包含运费 赠品总数量 总金额
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

(2 行受影响)

订单编号 数量 价格 优惠数量 优惠价格 运费 订单总金额 是否搭销 是否赠品
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- -------------------- --------------------
DD001 1 10 2 5 5 25 是 否
DD001 1 10 2 5 5 25 否 是
DD001 1 30 2 5 5 45 否 否
DD002 1 10 2 5 5 25 否 否
DD002 1 10 2 5 5 25 否 是
DD002 1 20 2 5 5 35 否 否

(6 行受影响)

订单编号 总数量 总价格 总优惠数量 总优惠价格 总运费 搭销总数量 搭销总金额不包含运费 赠品总数
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
DD001 3 50 6 30 15 1 20 1 95
DD002 3 40 6 30 15 0 0 1 85

(2 行受影响)

wang520d 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wzy_love_sly 的回复:]
订单删除怎么办?是删除记录还是有个删除的标识字段?
具体增删改都怎么操作?
[/Quote]
删除就直接删除记录了,改就是根据具体改的数据统计出金额
比如一个订单以前的数量是1个价格是100 现在改为2个了 那肯定就是2*100+优惠数量*优惠价格+运费=总的订单价格
加载更多回复(13)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧