帮忙写个查询语句,谢谢

xxmiaoyong126com 2010-06-30 02:44:49
if object_id('[customer]') is not null drop table [customer]
go
create table customer(fid varchar(20) ,name varchar(20))--客户表
insert into customer values('c1' , '客户1' )
insert into customer values('c2' , '客户2' )
insert into customer values('c3' , '客户3' )
insert into customer values('c4' , '客户4' )
insert into customer values('c5' , '客户5' )
if object_id('[sell]') is not null drop table [sell]
go
create table sell(customer varchar(20) ,mtr varchar(20) , mtime datetime , number decimal(18,2))--销售表
insert into sell values('c1' , 'm1' ,'2010-06-10 00:00:00.000' ,1)
insert into sell values('c1' , 'm2' ,'2010-06-10 00:00:00.000' ,2)
insert into sell values('c2' , 'm1' ,'2010-06-10 00:00:00.000' ,3)
insert into sell values('c2' , 'm3' ,'2010-06-10 00:00:00.000' ,4)
insert into sell values('c2' , 'm2' ,'2010-06-10 00:00:00.000' ,5)
insert into sell values('c3' , 'm2' ,'2010-06-10 00:00:00.000' ,6)
insert into sell values('c2' , 'm2' ,'2010-07-10 00:00:00.000' ,7)
insert into sell values('c2' , 'm3' ,'2010-06-10 00:00:00.000' ,8)
insert into sell values('c4' , 'm2' ,'2010-06-1 00:00:00.000' ,8)
insert into sell values('c1' , 'm1' ,'2010-08-10 00:00:00.000' ,1)
insert into sell values('c1' , 'm2' ,'2010-06-10 00:00:00.000' ,2)
insert into sell values('c2' , 'm1' ,'2010-05-10 00:00:00.000' ,3)
insert into sell values('c2' , 'm3' ,'2010-06-10 00:00:00.000' ,4)
insert into sell values('c2' , 'm2' ,'2010-06-10 00:00:00.000' ,5)
insert into sell values('c3' , 'm2' ,'2010-05-10 00:00:00.000' ,6)
insert into sell values('c2' , 'm2' ,'2010-05-10 00:00:00.000' ,7)
insert into sell values('c2' , 'm3' ,'2010-06-12 00:00:00.000' ,8)
insert into sell values('c4' , 'm2' ,'2010-06-11 00:00:00.000' ,8)
insert into sell values('c4' , 'm4' ,'2010-06-11 00:00:00.000' ,8)
insert into sell values('c4' , 'm4' ,'2010-06-11 00:00:00.000' ,8)
insert into sell values('c4' , 'm4' ,'2010-06-11 00:00:00.000' ,8)

if object_id('[Contrac]') is not null drop table [Contrac]--合同表
go
create table Contrac(customer varchar(20) , stime datetime , quantity int)
insert into Contrac values('c1' ,'2010-06-01 00:00:00.000' ,10)
insert into Contrac values('c2' ,'2010-06-01 00:00:00.000' ,20)
insert into Contrac values('c3' ,'2010-06-01 00:00:00.000' ,30)
insert into Contrac values('c1' ,'2010-07-01 00:00:00.000' ,50)
insert into Contrac values('c2' ,'2010-07-01 00:00:00.000' ,60)
insert into Contrac values('c3' ,'2010-07-01 00:00:00.000' ,70)
go

只查询M1,M2,M3这3种物料2010-6-10发货的数量,结果如下
客户 M1 M2 M3 日累计 月累计 本月合同量 完成率 上月累计 年累计
客户1 1.00 4.00 0.00 m1+m2+m3 5.00 10 0.5000 0.00 6.00
客户2 3.00 10.00 16.00 m1+m2+m3 37.00 20 1.8500 10.00 54.00
客户3 0.00 6.00 0.00 m1+m2+m3 6.00 30 0.2000 6.00 12.00
客户4 0.00 0.00 0.00 m1+m2+m3 40.00 0 0.0000 0.00 40.00

完成率是月累计/本月合同量
...全文
232 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream_1986 2010-06-30
  • 打赏
  • 举报
回复
路过,做个记号先
振乾 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xyj052 的回复:]
SQL code
Declare @date datetime
set @date='2010-06-10'
select a.name,a.fid ,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(b.日累计,0) as '日累计',isnull(d.月累计,0) as '月累计',isnull(c.quant……
[/Quote]

强悍。
xxmiaoyong126com 2010-06-30
  • 打赏
  • 举报
回复
这个,不知道你会不会生气,
因为客户5没有销售记录,没有在SELL表出现过,
所以报表是不需要统计这个客户的。
claro 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xxmiaoyong126com 的回复:]

我想问1下,这样多次的left join 结果集表,

是否特别影响SQL语句的执行效率?
[/Quote]是 。前提是关联table没有合理的索引。
xyj052 2010-06-30
  • 打赏
  • 举报
回复
Declare @date datetime
set @date='2010-06-10'
select a.name,a.fid ,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(b.日累计,0) as '日累计',isnull(d.月累计,0) as '月累计',isnull(c.quantity ,0)as '本月合同量',isnull(cast(cast(d.月累计 as decimal(18,2))/cast(c.quantity as decimal(18,2)) as decimal(18,2)),0) as '完成率',
isnull(e.上月累计,0) as 上月累计,isnull(f.年累计,0) as '年累计'
from
(select * from customer) a
left join (
select customer,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(m1,0)+isnull(m2,0)+isnull(m3,0) as '日累计' from
(select b.customer, mtr,number from sell b where mtime=@date ) a pivot
( sum(number) for mtr in ([m1],[m2],[m3])) as pvt
) b on a.fid=b.customer
left join
(select customer,sum(number) as '月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer )d on a.fid=d.customer
left join
(select customer,sum(quantity) as quantity from Contrac where left(convert(nvarchar(10),stime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer)c on a.fid=c.customer
left join
(select customer,sum(number) as '上月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),dateadd(month,-1,@date),102),7) group by customer )e on a.fid=e.customer
left join
(select customer,sum(number) as '年累计' from sell where left(convert(nvarchar(10),mtime,102),4)=left(convert(nvarchar(10),@date,102),4) group by customer )f on a.fid=f.customer

name fid m1 m2 m3 日累计 月累计 本月合同量 完成率 上月累计 年累计
-------------------- -------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ----------- --------------------------------------- --------------------------------------- ---------------------------------------
客户1 c1 1.00 4.00 0.00 5.00 5.00 10 0.50 0.00 6.00
客户2 c2 3.00 10.00 16.00 29.00 37.00 20 1.85 10.00 54.00
客户3 c3 0.00 6.00 0.00 6.00 6.00 30 0.20 6.00 12.00
客户4 c4 0.00 0.00 0.00 0.00 40.00 0 0.00 0.00 40.00
客户5 c5 0.00 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00

(5 行受影响)




晕了,这次终于对了.........
xyj052 2010-06-30
  • 打赏
  • 举报
回复
Declare @date datetime
set @date='2010-06-10'
select a.name,a.fid ,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(b.日累计,0),isnull(d.月累计,0),isnull(c.quantity ,0)as '本月合同量',isnull(cast(cast(d.月累计 as decimal(18,2))/cast(c.quantity as decimal(18,2)) as decimal(18,2)),0) as '完成率',
isnull(e.上月累计,0) as 上月累计,isnull(f.年累计,0)
from
(select * from customer) a
left join (
select customer,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(m1,0)+isnull(m2,0)+isnull(m3,0) as '日累计' from
(select b.customer, mtr,number from sell b where mtime=@date ) a pivot
( sum(number) for mtr in ([m1],[m2],[m3])) as pvt
) b on a.fid=b.customer
left join
(select customer,sum(number) as '月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer )d on a.fid=d.customer
left join
(select customer,sum(quantity) as quantity from Contrac where left(convert(nvarchar(10),stime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer)c on a.fid=c.customer
left join
(select customer,sum(number) as '上月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),dateadd(month,-1,@date),102),7) group by customer )e on a.fid=e.customer
left join
(select customer,sum(number) as '年累计' from sell where left(convert(nvarchar(10),mtime,102),4)=left(convert(nvarchar(10),@date,102),4) group by customer )f on a.fid=f.customer


name fid m1 m2 m3 本月合同量 完成率 上月累计
-------------------- -------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ----------- --------------------------------------- --------------------------------------- ---------------------------------------
客户1 c1 1.00 4.00 0.00 5.00 5.00 10 0.50 0.00 6.00
客户2 c2 3.00 10.00 16.00 29.00 37.00 20 1.85 10.00 54.00
客户3 c3 0.00 6.00 0.00 6.00 6.00 30 0.20 6.00 12.00
客户4 c4 0.00 0.00 0.00 0.00 40.00 0 0.00 0.00 40.00
客户5 c5 0.00 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00

(5 行受影响)


有个字段取错了,这样就没问题了
xxmiaoyong126com 2010-06-30
  • 打赏
  • 举报
回复
我想问1下,这样多次的left join 结果集表,

是否特别影响SQL语句的执行效率?
xyj052 2010-06-30
  • 打赏
  • 举报
回复
Declare @date datetime
set @date='2010-06-10'
select a.name,b.customer ,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(b.日累计,0),isnull(d.月累计,0),isnull(c.quantity ,0)as '本月合同量',isnull(cast(cast(d.月累计 as decimal(18,2))/cast(c.quantity as decimal(18,2)) as decimal(18,2)),0) as '完成率',
isnull(e.上月累计,0) as 上月累计,isnull(f.年累计,0)
from
(select * from customer) a
left join (
select customer,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(m1,0)+isnull(m2,0)+isnull(m3,0) as '日累计' from
(select b.customer, mtr,number from sell b where mtime=@date ) a pivot
( sum(number) for mtr in ([m1],[m2],[m3])) as pvt
) b on a.fid=b.customer
left join
(select customer,sum(number) as '月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer )d on a.fid=d.customer
left join
(select customer,sum(quantity) as quantity from Contrac where left(convert(nvarchar(10),stime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer)c on a.fid=c.customer
left join
(select customer,sum(number) as '上月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),dateadd(month,-1,@date),102),7) group by customer )e on a.fid=e.customer
left join
(select customer,sum(number) as '年累计' from sell where left(convert(nvarchar(10),mtime,102),4)=left(convert(nvarchar(10),@date,102),4) group by customer )f on a.fid=f.customer


结果:
name customer m1 m2 m3 本月合同量 完成率 上月累计
-------------------- -------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ----------- --------------------------------------- --------------------------------------- ---------------------------------------
客户1 c1 1.00 4.00 0.00 5.00 5.00 10 0.50 0.00 6.00
客户2 c2 3.00 10.00 16.00 29.00 37.00 20 1.85 10.00 54.00
客户3 c3 0.00 6.00 0.00 6.00 6.00 30 0.20 6.00 12.00
客户4 NULL 0.00 0.00 0.00 0.00 40.00 0 0.00 0.00 40.00
客户5 NULL 0.00 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00

(5 行受影响)
xyj052 2010-06-30
  • 打赏
  • 举报
回复
Declare @date datetime
set @date='2010-06-10'
select a.name,b.customer ,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(b.日累计,0),isnull(d.月累计,0),isnull(c.quantity ,0)as '本月合同量',isnull(cast(cast(d.月累计 as decimal(18,2))/cast(c.quantity as decimal(18,2)) as decimal(18,2)),0) as '完成率',
isnull(e.上月累计,0) as 上月累计,isnull(f.年累计,0)
from
(select * from customer) a
left join (
select customer,isnull(m1,0) as m1,isnull(m2,0) as m2,isnull(m3,0) as m3,isnull(m1,0)+isnull(m2,0)+isnull(m3,0) as '日累计' from
(select b.customer, mtr,number from sell b where mtime=@date ) a pivot
( sum(number) for mtr in ([m1],[m2],[m3])) as pvt
) b on a.fid=b.customer
left join
(select customer,sum(number) as '月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer )d on a.fid=d.customer
left join
(select customer,sum(quantity) as quantity from Contrac where left(convert(nvarchar(10),stime,102),7)=left(convert(nvarchar(10),@date,102),7) group by customer)c on a.fid=c.customer
left join
(select customer,sum(number) as '上月累计' from sell where left(convert(nvarchar(10),mtime,102),7)=left(convert(nvarchar(10),dateadd(month,-1,@date),102),7) group by customer )e on a.fid=e.customer
left join
(select customer,sum(number) as '年累计' from sell where left(convert(nvarchar(10),mtime,102),4)=left(convert(nvarchar(10),@date,102),4) group by customer )f on a.fid=f.customer

这样就没问题了
结果如下:
name customer m1 m2 m3 本月合同量 完成率 上月累计
-------------------- -------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ----------- --------------------------------------- --------------------------------------- ---------------------------------------
客户1 c1 1.00 4.00 0.00 5.00 5.00 10 0.50 0.00 6.00
客户2 c2 3.00 10.00 16.00 29.00 37.00 20 1.85 10.00 54.00
客户3 c3 0.00 6.00 0.00 6.00 6.00 30 0.20 6.00 12.00
客户4 NULL 0.00 0.00 0.00 0.00 40.00 0 0.00 0.00 40.00
客户5 NULL 0.00 0.00 0.00 0.00 0.00 0 0.00 0.00 0.00

(5 行受影响)
xxmiaoyong126com 2010-06-30
  • 打赏
  • 举报
回复
TO:xys_777
你的代码跟我的要求有点不一样,
你不能where convert(varchar(10),b.mtime,120)='2010-06-10'
客户4 虽然在'2010-06-10'这天没销售,但是也要在报表里显示出来,因为月累计和年累计等字段是有数据的
客户4 0.00 0.00 0.00 m1+m2+m3 40.00 0 0.0000 0.00 40.00
xxmiaoyong126com 2010-06-30
  • 打赏
  • 举报
回复
其实我也有这个困惑,就是代码的可维护性,
可是SQLSERVER很多函数用起来还是很方便直观的啊
如果把数据取过来,再用ASP程序去算数据的话,
感觉很难,没SQLSERVER处理来的简单。

临时表或许是个不错的办法,
下次用用看,

永生天地 2010-06-30
  • 打赏
  • 举报
回复
我也觉得这样一点都不通用
永生天地 2010-06-30
  • 打赏
  • 举报
回复
select a.name,
sum(case when b.mtr='m1' then number else 0 end) as M1,
sum(case when b.mtr='m2' then number else 0 end) as M2,
sum(case when b.mtr='m3' then number else 0 end) as M3,
sum(case when b.mtr in ('m1','m2','m3') then number else 0 end) as 日累计,
d.月累计,
c.quantity 本月合同量,
d.月累计*1.0/c.quantity 完成率,
e.上月累计,
f.年累计
from [customer] a left join [sell] b on a.fid=b.customer
left join [Contrac] c on a.fid=c.customer and datediff(month,c.stime,b.mtime)=0
left join (select customer,convert(varchar(7),mtime,120)+'-01' mtime,
sum(case when mtr in ('m1','m2','m3') then number else 0 end) 月累计
from [sell] group by customer,convert(varchar(7),mtime,120)) d
on a.fid=d.customer and datediff(month,d.mtime,b.mtime)=0
left join (select customer,convert(varchar(7),mtime,120)+'-01' mtime,
sum(case when mtr in ('m1','m2','m3') then number else 0 end) 上月累计
from [sell] group by customer,convert(varchar(7),mtime,120)) e
on a.fid=e.customer and datediff(month,e.mtime,b.mtime)=1
left join (select customer,convert(varchar(4),mtime,120)+'-01-01' mtime,
sum(case when mtr in ('m1','m2','m3') then number else 0 end) 年累计
from [sell] group by customer,convert(varchar(4),mtime,120)) f
on a.fid=f.customer and datediff(year,f.mtime,b.mtime)=0
where convert(varchar(10),b.mtime,120)='2010-06-10'
group by
a.name,
convert(varchar(10),b.mtime,120),
d.月累计,
c.quantity ,
e.上月累计,
f.年累计
--结果
/*
name M1 M2 M3 日累计 月累计 本月合同量 完成率 上月累计 年累计
-------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ----------- --------------------------------------- --------------------------------------- ---------------------------------------
客户1 1.00 4.00 0.00 5.00 5.00 10 0.500000 NULL 6.00
客户2 3.00 10.00 16.00 29.00 37.00 20 1.850000 10.00 54.00
客户3 0.00 6.00 0.00 6.00 6.00 30 0.200000 6.00 12.00

(3 行受影响)

*/
laup_8897 2010-06-30
  • 打赏
  • 举报
回复
我做过这种的报表,最好是写存储过程,然后用临时表或者拼字符串的形式,计算好之后再拼起来,用一条查询语句的话我感觉挺复杂,不好进行后期维护,希望对您有所帮助!也希望高人能看看还有什么别的方法不,帮顶一下
小猫阿尤 2010-06-30
  • 打赏
  • 举报
回复
不懂 学习 帮顶 蹭分。。。
但愿大家互相进修进修,大家对于破解都不是很了解,人们想学破解,可是去无从入手,所以决议为大家写1个破解初级读物的教程,但愿能大家了解破解有一些帮忙,但愿能有更多的人踏入破解的大门   1.低级,修改步伐,用ultraedit等东西修改exe文件,称暴力破解,略称爆破   中级,追出软体的注册码   高级,开具注册机   2.经常使用破解东西   (1)侦壳东西:PEiD   (2)消息联合的OllyDbg引领破解东西的新潮水   一,此刻咱们起首来进修下破解的开端,爆破~   1.侦壳   要破解1个软体起主要做的就是侦壳,要侦壳就要对壳有绝对似的了解,家喻户晓,软体作者用编程语言编著好软体后,是将它编译成扩展名为EXE的可执行文件编译为EXE的目的有两点:   (1)有一些版权信息需要掩护起来,不克不及让别人随心改动,如作者的姓名、软体名称等;   (2)需要给步伐"瘦身",从而利便存储、使用以及网上传道输送   为了编译,会用到一些软体它们能将可执行文件压缩以及对信息加密(图1),实现上面所说的两个功效,这些个软体称为加壳软体为软体加上的东东就称为"壳"加壳软体差别于一般的WinZIP、WinRAR等打包类压缩软体加壳软体是压缩可执行文件的,压缩后的文件可以直接运行   最多见的加壳软体有3个:ASPACK 、UPX、PEcompact终究它们是主流,据计数,用它们加壳的软体约占市面所有软体的90%!其它不经常使用的加壳软体有ASPROTECT、PETITE 、NEOLITE、TELOCK等软体最多见的编程语言是Delphello,Visual Basic(略称VB),Visual C++(略称VC)了解些编程的常识,会让破解更加轻车熟道   底下来讲侦壳,此刻比力经常使用侦壳软体就PeiD,他具备华美的图形界面外壳整合(新增到鼠标右键)功效令使用更加利便,撑持拖放操作配置时,务请将"扩展到鼠标右键"打上对号   其使用要领是,鼠标点住XX.exe,按鼠标右键,选"使用PEid扫描"便可;"壳"的信息就显示在底部   2.破解东西OD   有关OD的先容我把他放到附件里了,这个是看雪论坛的先容,是比力周全的,至少我感觉比我写的要好,所以大家根据他可以大好的了解OD   3.爆破实例   爆破是破解的开端,所说的爆破,就是指路程经过过程修改可执行文件的源文件,降临达相应的目的你半大白?呵呵,举个例子好了,好比说某同享软体,它比力用户输入的注册码,要是用户输入的,跟它路程经过过程用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码不错了),那末它就会跳到注册乐成的处所去,不然就跳到堕落的处所去   大白过来了吧,咱们只要找到这个跳转指令,把它修改成咱们需要的"造型",如许,咱们是否就可认随心所欲了?   一,破解时经常使用的汇编指令如下,汇编较弱者可先强行违住,以后就可逐步理解了   cmp a,b //比力a与b   mov a,b //把b的值送给a,使a=b   ret //归回主步伐   nop //无效用,英文"no operation"的简写,意思是"do nothellong"(呆板码90) (解释:ultraedit打开编辑exe文件时瞅见90,等同于汇编语句nop)   call //挪用子步伐,子步伐以ret末端   je 或jz //若相等则跳(呆板码74 或0F84)   jne或jnz //若不相等则跳(呆板码75或0F85)   jmp //无前提跳(呆板码EB)   jb //若小于则跳   ja //若大于则跳   jg //若大于则跳   jge //若大于等于则跳   jl //若小于则跳   jle //若小于等于则跳   pop xx //xx出栈   push xx //xx压栈   更为具体的指令请查阅汇编册本   4.破解常见修改,参看表1   汇编指令修改 相应的呆板码修改(路程经过过程16进制编辑器实现)   jnz/jne->nop 75->90   jnz/jne -> jmp 75-> EB   jz/je->nop 74->90   jz/je -> jmp 74-> EB   jnz -> jz 75->74 或 0F 85 -> 0F 84   jz -> jnz 74->75 或 0F 84 -> 0F 85   jnz -> jz 75->74 或 0F 85 -> 0F 84   je-> jne 74->75 或 0F 84 -> 0F 85   表1

34,873

社区成员

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

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