首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

再问〈sql语句写法〉

2012-01-20 
再问〈求一个sql语句写法〉A表:cardtypeid,date_time12007/02/0322007/03/0332007/04/0322007/04/03B表:card

再问〈求一个sql语句写法〉
A表:        
cardtypeid,date_time    
1                                         2007/02/03    
2                                         2007/03/03    
3                                         2007/04/03    
2                                         2007/04/03    
B表:        
cardtypeid,     cardtypeName    
1                                         甲    
2                                         乙    
3                                         丙    
 
查询结果:    
一,   按照月份统计  
月份                 甲         乙         丙     合计    
2007/02     1             0             0             1    
2007/03     0             1             0             1    
2007/04     0             1             1             2    
合计                 1             2             1             4    
 
二,按照日期统计
日期                 甲         乙         丙     合计    
2007/02/03     1             0             0             1    
2007/03/03     0             1             0             1    
2007/04/03     0             1             1             2    
合计                 1             2             1             4    

三,按照星期统计(2007/02/03和2007/03/03都是星期二,2007/04/03是星期六)
星期                 甲         乙         丙     合计        
星期二             1             1             0             2  


星期六             0             1             1             2    
合计                 1             2             1             4    
 




[解决办法]
--如果你的B表中的cardtypeName是固定的,那麼就可以如下寫,不用EXEC,否則就要用EXEC
--一, 按照月份统计
Select
IsNull(月份, '合计 ') As 月份, 甲, 乙, 丙, 合计
From
(
Select
Convert(Varchar(7), date_time, 111) As 月份,
SUM(Case cardtypeName When '甲 ' Then 1 Else 0 End) As 甲,
SUM(Case cardtypeName When '乙 ' Then 1 Else 0 End) As 乙,
SUM(Case cardtypeName When '丙 ' Then 1 Else 0 End) As 丙,
Count(*) As 合计
From
A
Inner Join
B
On A.
cardtypeid = B.cardtypeid
Group By
Convert(Varchar(7), date_time, 111)
With Rollup
) A

--二,按照日期统计
Select
IsNull(月份, '合计 ') As 月份, 甲, 乙, 丙, 合计
From
(
Select
Convert(Varchar(10), date_time, 111) As 月份,
SUM(Case cardtypeName When '甲 ' Then 1 Else 0 End) As 甲,
SUM(Case cardtypeName When '乙 ' Then 1 Else 0 End) As 乙,
SUM(Case cardtypeName When '丙 ' Then 1 Else 0 End) As 丙,
Count(*) As 合计
From
A
Inner Join
B
On A.
cardtypeid = B.cardtypeid
Group By
Convert(Varchar(10), date_time, 111)
With Rollup
) A
[解决办法]
--如果你的B表中的cardtypeName是固定的,那麼就可以如下寫,不用EXEC,否則就要用EXEC

--建立測試環境
Create Table A
(cardtypeidInt,
date_timeDateTime)
Insert A Select 1, '2007/02/03 '
Union All Select 2, '2007/03/03 '
Union All Select 3, '2007/04/03 '
Union All Select 2, '2007/04/03 '
Create Table B
(cardtypeidInt,
cardtypeNameNvarchar(10))
Insert B Select 1, N '甲 '
Union All Select 2, N '乙 '
Union All Select 3, N '丙 '
GO
--測試
--一, 按照月份统计
Select
IsNull(月份, '合计 ') As 月份, 甲, 乙, 丙, 合计
From
(
Select
Convert(Varchar(7), date_time, 111) As 月份,
SUM(Case cardtypeName When '甲 ' Then 1 Else 0 End) As 甲,
SUM(Case cardtypeName When '乙 ' Then 1 Else 0 End) As 乙,
SUM(Case cardtypeName When '丙 ' Then 1 Else 0 End) As 丙,
Count(*) As 合计
From
A
Inner Join
B
On A.
cardtypeid = B.cardtypeid
Group By
Convert(Varchar(7), date_time, 111)
With Rollup
) A

--二,按照日期统计
Select
IsNull(日期, '合计 ') As 日期, 甲, 乙, 丙, 合计
From
(
Select
Convert(Varchar(10), date_time, 111) As 日期,
SUM(Case cardtypeName When '甲 ' Then 1 Else 0 End) As 甲,
SUM(Case cardtypeName When '乙 ' Then 1 Else 0 End) As 乙,
SUM(Case cardtypeName When '丙 ' Then 1 Else 0 End) As 丙,
Count(*) As 合计
From
A
Inner Join
B
On A.
cardtypeid = B.cardtypeid
Group By
Convert(Varchar(10), date_time, 111)


With Rollup
) A

--三,按照星期统计(2007/02/03和2007/03/03都是星期二,2007/04/03是星期六)
Select
IsNull(星期, '合计 ') As 星期, 甲, 乙, 丙, 合计
From
(
Select
DateName(dw, date_time) As 星期,
SUM(Case cardtypeName When '甲 ' Then 1 Else 0 End) As 甲,
SUM(Case cardtypeName When '乙 ' Then 1 Else 0 End) As 乙,
SUM(Case cardtypeName When '丙 ' Then 1 Else 0 End) As 丙,
Count(*) As 合计
From
A
Inner Join
B
On A.
cardtypeid = B.cardtypeid
Group By
DateName(dw, date_time)
With Rollup
) A
GO
--刪除測試環境
Drop Table A, B
--結果
/*
月份甲乙丙合计
2007/021001
2007/030101
2007/040112
合计1214

日期甲乙丙合计
2007/02/031001
2007/03/030101
2007/04/030112
合计1214

星期甲乙丙合计
星期二0112
星期六1102
合计1214
*/

热点排行
Bad Request.