首页 新闻 搜索 专区 学院

求助:Sql统计复杂查询

0
悬赏园豆:100 [已解决问题] 解决于 2009-07-02 17:47

关于充值和消费记录的一份统计表格。

先看一下表结构吧

1.充值表(FullOne,FullTow)两张,之间没有任何关系(设计时的问题,改不了)

2.消费表(Orders)一张,是消费记录。和充值也没有任何关系。

 

FullOne 结构:

FullOneID(主键,int),FullMoney(充值金额,money),FullTime(充值时间,datetime)

FullTow结构:

FullTwoID(主键,int),FullMoney(充值金额,money),FullType(充值类型,nvarchar(50)),InsertTime(充值时间,datetime)

Orders结构:

OrderID(主键,订单记录号,int),Pay(消费金额,money),OrderTime(消费时间,datetime)

 

说明:

  FullOne 表是现金充值的记录表(表内记录都是现金方式的充值)

  FullTow 表则包括其他类型的充值记录,如支付宝,易宝,也包括现金方式的充值。(这里比较难受一点,现金方式的充值数据为什么两张表都有呢,因为以前各种方式充值都在FullTwo表里,后来需求,逻辑更改后又建了一张FullOne表,所以现金充值汇总的话应该是FullOne表的数据+FullTwo中FullType='现金' 的记录合起来。- - 不知道表述清楚没有。)

  Orders就是消费的记录了。没什么可说的。

表结构、数据代码输出一下,节省大家时间。

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FullOne](
[FullOneID] [int] IDENTITY(1,1) NOT NULL,
[FullMoney] [money] NOT NULL,
[FullTime] [datetime] NOT NULL CONSTRAINT [DF_FullOne_FullTime] DEFAULT (getdate())
)
ON [PRIMARY]
GO
INSERT INTO FullOne (FullMoney, FullTime ) VALUES ( 10,'2009-6-5 14:9:0.453' )
INSERT INTO FullOne (FullMoney, FullTime ) VALUES ( 10,'2009-6-6 14:9:0.453' )
INSERT INTO FullOne (FullMoney, FullTime ) VALUES ( 10,'2009-6-7 14:9:0.453' )
INSERT INTO FullOne (FullMoney, FullTime ) VALUES ( 10,'2009-6-9 14:9:0.453' )
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[FullTwo](
[FullTwoID] [int] IDENTITY(1,1) NOT NULL,
[FullMoney] [money] NOT NULL,
[FullType] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[InsertTime] [datetime] NOT NULL CONSTRAINT [DF_FullTwo_InsertTime] DEFAULT (getdate())
)
ON [PRIMARY]
GO
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'现金','2009-6-5 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'支付宝','2009-6-5 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'支付宝','2009-6-6 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'易宝','2009-6-7 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'易宝','2009-6-9 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'支付宝','2009-6-9 14:24:38.859')
INSERT INTO FullTwo (FullMoney,FullType,InsertTime)VALUES( 10,'现金','2009-6-9 14:24:38.859')
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Orders](
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[Pay] [money] NOT NULL,
[OrderTime] [datetime] NOT NULL CONSTRAINT [DF_Orders_OrderTime] DEFAULT (getdate())
)
ON [PRIMARY]
GO
INSERT INTO Orders (Pay, OrderTime ) VALUES ( 5, '2009-6-5 14:16:32.15')
INSERT INTO Orders (Pay, OrderTime ) VALUES ( 7, '2009-6-7 14:16:32.15')
INSERT INTO Orders (Pay, OrderTime ) VALUES ( 9, '2009-6-9 14:16:32.15')
GO

 


现在要求的统计是。

  根据一个时间段。(开始时间,结束时间),求出该时间段内每一天的各类型收入汇总和支出汇总

比如:开始时间 2009-6-5,结束时间 2009-6-10

得到的结果集应该是

日期    现金充入    支付宝充入    易宝充入    总消费额

2009-6-5  20      10        0        5

2009-6-6  10      10        0        0

2009-6-7  10      0         10        7

2009-6-8  0       0         0        0

2009-6-9  20      10        10        9

 

不知道我说清楚没有,

再次说明,这个题我觉得是按照日期分组,case when 统计各支付类型的sum

    问题是现金充值的金额汇总还要把另一张表的值合并进来,

      还有就是按日期分组有的日期,比如8号,因为各表都没有记录,是不会出现的,怎么能让他出来

      还有消费记录表的记录也要统计,一起出来。

 

然后我就彻底晕了,不知道该怎么办了。

 

请大家帮忙研究看看。

谢谢。

如果没有表述清楚请大家提出,我尽全力补充。

 

调调儿的主页 调调儿 | 初学一级 | 园豆:155
提问于:2009-07-01 14:51
< >
分享
最佳答案
0

行列转换,不过8号也要出来是个问题。不出来倒是还比较方便。

阿水 | 小虾三级 |园豆:506 | 2009-07-01 17:13
其他回答(2)
0

你要的结果是给你拼出来了,可是效率相当的差,呵呵,建议近一个含有时间段的临时表来进行左联处理,我只跑了下‘2008年1月1号’到‘2009年12月31号’,程序就挂了,出现下面的消息:

消息 8623,级别 16,状态 1,第 1 行
查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询。如果您认为该消息的出现纯属错误,请与客户支持服务部门联系,了解详细信息。

代码就给你贴上了,你看着改进去了,我的SQL水平太次,别介意,呵呵。

 

Code
| 园豆:770 (小虾三级) | 2009-07-02 00:40
0

  select updatedate as 日期, sum(isnull(case fulltype when '现金' then fullmoney end,0)) as 现金, sum(isnull(case fulltype when '支付宝' then fullmoney end,0)) as 支付宝, sum(isnull(case fulltype when '易宝' then fullmoney end,0)) as 易宝, sum(isnull(case fulltype when '总消费额' then fullmoney end,0)) as 总消费额  from ( select SUM(fullmoney) as fullmoney,fulltype,updatedate from ( select fullmoney ,'现金' as fulltype, CONVERT(varchar,fulltime,110) as updatedate from fullone union all select fullmoney,fulltype,CONVERT(varchar,inserttime,110) as updatedate from fulltwo union all select pay as fullmoney,'总消费额' as fulltype,CONVERT(varchar,ordertime,110) as updatedate from orders ) a  group by updatedate ,fulltype) b group by updatedate

夏晨皓 | 园豆:202 (菜鸟二级) | 2012-12-13 13:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册