再问〈求一个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
*/