需要根据短信发送记录做一个按月份和运营商的统计,效果如下:月份     运营商   数量
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? 

解决方案 »

  1.   

    SQL Server中以前的查询如下:select convert(varchar(7),SendDate,120) as yf,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 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)
      

  2.   

    我不是太熟数据库,不过我看了下convert和case..when数据库都支持的,为什么别的数据库不能用这呢
      

  3.   

    首先要明确:
    但是现在程序需要多中数据库的支持是指的是什么?如果是指  sql 2000 + mysql + oracle那么现在查询 是 有几个数据库 要查询几次 返回多个 List  
    然后只能 循环 然后根据:月份     运营商 进行唯一对应组合最后返回一个最终的list 
      

  4.   


    就是说,程序中的SQL语句需要同时支持SQL Server、Oracle、MySql
    以便用户随便用什么数据库都可以,所以convert、substring都不能用了只有一个数据库,查询一次
    我在一楼回复的代码是SQL Server可以直接查出最终结果的,但Oracle和MySQL不行
      

  5.   

    我也很头疼这个
    如果说“datetime转换成月”没办法统一,那基本你的语句也就没办法统一了
    因为你是要group by 月的只能变个思路了,反正不管怎么样,你肯定是要去配置这个应用(或者说你查询之前)是使用哪个数据库的
    那你就写多个版本的语句,跟不同的数据库对应吧。
      

  6.   

    直接把数据拿出来·放到一个文件里,就不必要考虑SQL的多样性了··直接使用IO读取··
      

  7.   

    哈哈,那还不如直接就用一条select * from biao语句查出来之后用代码统计.....
      

  8.   


    多个数据库 那么 有多个sql 是无法避免的,应为 要用到函数了 那么必然存在不 兼容性只能写多个不同的方法针对不同的数据库进行操作。多谢几个Dao的实现吧
    然后根据不同db驱动动态判断使用dao情况,或者有配置文件
      

  9.   

    十分感谢楼上,现在正在写这个功能针对Oracle的实现
      

  10.   

    已经做完,根据配置来选择执行哪条SQL