需要根据短信发送记录做一个按月份和运营商的统计,效果如下:月份 运营商 数量
2011-02 中国联通 1
2011-02 中国移动 1
2011-03 中国移动 1
2011-04 中国联通 2
2011-04 中国移动 3
2011-04 中国电信 1
之前是用SQL Server,通过一条 SQL即可完成,但是现在程序需要多中数据库的支持,这条SQL就不能用了,需要把短信发送记录做出来然后通过程序构造一个List表和数据如下:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSMS_His]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSMS_His]
GOCREATE TABLE [dbo].[tSMS_His] (
[PhoneID] [nvarchar] (11) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[createDate] [datetime] NOT NULL ,
[Content1] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Content2] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SendDate] [datetime] NOT NULL
) ON [PRIMARY]
GOinsert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15299947755',
'2011-04-19 12:25:33',N'测试',N'的','2011-04-19 12:25:35')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13139932386',
'2011-04-19 12:25:33',N'asdasd',N'sfdewrf','2011-04-19 12:25:33')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13899287264',
'2011-04-20 09:57:45',N'654654654asd',N'efregfretertre','2011-04-20 09:57:45')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15309825842',
'2011-04-12 13:25:20',N'ddd',N'rrr','2011-04-12 13:25:20')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13208611822',
'2011-04-11 23:01:24',N'fde',N'frewt','2011-04-11 23:05:00')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13579348521',
'2011-04-09 12:00:00',N'dweew',N'564564','2011-04-09 12:00:00')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15299947765',
'2011-03-28 12:33:27',N'asdas',N'//////85148','2011-03-28 12:33:50')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13752148426',
'2011-02-23 21:37:57',N'd7891564564',N'45641','2011-02-23 21:38:15')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13049824875',
'2011-02-23 19:24:33',N'dd3r4tg5yh',N'4564564654','2011-02-23 19:24:45')通过SQL查询出如下列表:
手机号、创建时间、内容1、内容2、发送时间这样如何再构造出一个需要的LIST?
2011-02 中国联通 1
2011-02 中国移动 1
2011-03 中国移动 1
2011-04 中国联通 2
2011-04 中国移动 3
2011-04 中国电信 1
之前是用SQL Server,通过一条 SQL即可完成,但是现在程序需要多中数据库的支持,这条SQL就不能用了,需要把短信发送记录做出来然后通过程序构造一个List表和数据如下:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSMS_His]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSMS_His]
GOCREATE TABLE [dbo].[tSMS_His] (
[PhoneID] [nvarchar] (11) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[createDate] [datetime] NOT NULL ,
[Content1] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Content2] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SendDate] [datetime] NOT NULL
) ON [PRIMARY]
GOinsert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15299947755',
'2011-04-19 12:25:33',N'测试',N'的','2011-04-19 12:25:35')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13139932386',
'2011-04-19 12:25:33',N'asdasd',N'sfdewrf','2011-04-19 12:25:33')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13899287264',
'2011-04-20 09:57:45',N'654654654asd',N'efregfretertre','2011-04-20 09:57:45')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15309825842',
'2011-04-12 13:25:20',N'ddd',N'rrr','2011-04-12 13:25:20')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13208611822',
'2011-04-11 23:01:24',N'fde',N'frewt','2011-04-11 23:05:00')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13579348521',
'2011-04-09 12:00:00',N'dweew',N'564564','2011-04-09 12:00:00')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'15299947765',
'2011-03-28 12:33:27',N'asdas',N'//////85148','2011-03-28 12:33:50')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13752148426',
'2011-02-23 21:37:57',N'd7891564564',N'45641','2011-02-23 21:38:15')
insert tSMS_His(PhoneID,createDate,Content1,Content2,SendDate) values(N'13049824875',
'2011-02-23 19:24:33',N'dd3r4tg5yh',N'4564564654','2011-02-23 19:24:45')通过SQL查询出如下列表:
手机号、创建时间、内容1、内容2、发送时间这样如何再构造出一个需要的LIST?
WHEN CONVERT(VARCHAR(3),PhoneID) IN ('134','135','136','137','138','139','150','151','152','154','158','159','187','188') THEN '中国移动' ELSE '中国电信' end as services,count(*) as count from tSMS_His where (senddate >= '2011-1-1 0:00:00' AND senddate <= '2011-4-30 23:59:59' ) GROUP BY CASE WHEN CONVERT(VARCHAR(3),PhoneID) IN ('130','131','132','155','156','157','186') THEN '中国联通' WHEN CONVERT(VARCHAR(3),PhoneID) IN ('134','135','136','137','138','139','150','151','152','154','158','159','187','188') THEN '中国移动' ELSE '中国电信' end,convert(varchar(7),SendDate,120)
但是现在程序需要多中数据库的支持是指的是什么?如果是指 sql 2000 + mysql + oracle那么现在查询 是 有几个数据库 要查询几次 返回多个 List
然后只能 循环 然后根据:月份 运营商 进行唯一对应组合最后返回一个最终的list
就是说,程序中的SQL语句需要同时支持SQL Server、Oracle、MySql
以便用户随便用什么数据库都可以,所以convert、substring都不能用了只有一个数据库,查询一次
我在一楼回复的代码是SQL Server可以直接查出最终结果的,但Oracle和MySQL不行
如果说“datetime转换成月”没办法统一,那基本你的语句也就没办法统一了
因为你是要group by 月的只能变个思路了,反正不管怎么样,你肯定是要去配置这个应用(或者说你查询之前)是使用哪个数据库的
那你就写多个版本的语句,跟不同的数据库对应吧。
多个数据库 那么 有多个sql 是无法避免的,应为 要用到函数了 那么必然存在不 兼容性只能写多个不同的方法针对不同的数据库进行操作。多谢几个Dao的实现吧
然后根据不同db驱动动态判断使用dao情况,或者有配置文件