请教按月份上、中、下旬统计多个字段

kielin 2014-11-20 06:27:27
原始数据有ID,Name,Total1,Total2,Date1字段,如下面显示
 
ID Name Total1 Total2 Date1
1 Name1 8.981132 476 6/15/2014
1 Name2 9 18 7/9/2014
1 Name3 14.589062 1203.16 7/25/2014
1 Name4 30.750759 2023.4 7/11/2014
2 Name1 7 7 6/13/2014
2 Name2 13.491984 5714.8 7/22/2014
2 Name2 26.976811 5921.68 7/18/2014


期望获取到每个ID,每个Name在每个月的上中下旬的数据统计
ID	Name	6-上旬-Total1	6-上旬-Total2	6-中旬-Total1	6-中旬-Total2	6-下旬-Total1	6-下旬-Total2	7-上旬-Total1	7-上旬-Total2	7-中旬-Total1	7-中旬-Total2	7-下旬-Total1	7-下旬-Total2
1 Name1 0 0 8.981132 476 0 0 0 0 0 0 0 0
1 Name2 0 0 0 0 0 9 18 0 0 0 0
1 Name3 14.589062 1203.16
1 Name4 30.750759 2023.4
2 Name1 7 7
2 Name2 13.491984 5714.8
2 Name2 26.976811 5921.68

...全文
344 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjjtwo 2015-05-29
  • 打赏
  • 举报
回复
引用 7 楼 kielin 的回复:
[quote=引用 5 楼 ky_min 的回复:]
DECLARE @MONTH DATETIME
SET @MONTH='2014-07-01'
SELECT ID,Name
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [preSelectedMonth-f-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [preSelectedMonth-f-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [preSelectedMonth-m-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [preSelectedMonth-m-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [preSelectedMonth-l-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [preSelectedMonth-l-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [SelectedMonth-f-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [SelectedMonth-f-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [SelectedMonth-m-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [SelectedMonth-m-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [SelectedMonth-l-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [SelectedMonth-l-Total2]
FROM TB
感觉只能这样了
谢谢![/quote] 这个只能用在创建的临时表吗 试了下数据库里建的表,提示对象名 “表名1” 无效
还在加载中灬 2014-11-21
  • 打赏
  • 举报
回复
问题解决了? 分可以随意分配的,总分等于贴子分即可
kielin 2014-11-21
  • 打赏
  • 举报
回复
[quote=引用 6 楼 tangguangqiang 的回复:] quote] 怎么给不分给你,只能给一个人?
kielin 2014-11-21
  • 打赏
  • 举报
回复
引用 6 楼 tangguangqiang 的回复:


use tempdb
create table test(id int,[name] varchar(30),total1 decimal(18,6),total2 decimal(18,6),date1 smalldatetime)
insert into test
select 1,	'Name1',	8.981132,	  476	,'6/15/2014' union all
select 1,	'Name2',	9	     ,    18	,'7/9/2014'  union all
select 1,	'Name3',	14.589062,	1203.16	,'7/25/2014' union all
select 1,	'Name4',	30.750759,	2023.4	,'7/11/2014' union all
select 2,	'Name1',	7	      ,  7	    ,'6/13/2014' union all
select 2,	'Name2',	13.491984,	5714.8	,'7/22/2014' union all
select 2,	'Name2',	26.976811,	5921.68	,'7/18/2014' 

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+' sum(case when day(date1) between 1 and 10 then total1 else 0 end)  as ['+ cast(month(date1) as varchar)+'-上旬-total1],'+char(10)+
' sum(case when day(date1)>10 and day(date1)<=20 then total1 else 0 end ) as ['+ cast(month(date1) as varchar)+'-中旬-total1],'+char(10)+
' sum(case when day(date1)>20 then total1 else 0 end)  as [' +cast(month(date1) as varchar)+'-下旬-total1],'+char(10)+
' sum(case when day(date1) between 1 and 10 then total2 else 0 end)  as ['+ cast(month(date1) as varchar)+'-上旬-total2],'+char(10)+
' sum(case when day(date1)>10 and day(date1)<=20 then total2 else 0 end ) as ['+ cast(month(date1) as varchar)+'-中旬-total2],'+char(10)+
' sum(case when day(date1)>20 then total2 else 0 end ) as ['+ cast(month(date1) as varchar)+'下旬-total2]'
from test group by month(date1)

set @sql='select id,[name],'+@sql
+'from test group by id,name,convert(varchar(6),date1,112)'
--print @sql
exec(@sql)

 
谢谢
kielin 2014-11-21
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
DECLARE @MONTH DATETIME
SET @MONTH='2014-07-01'
SELECT ID,Name
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [preSelectedMonth-f-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [preSelectedMonth-f-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [preSelectedMonth-m-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [preSelectedMonth-m-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [preSelectedMonth-l-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [preSelectedMonth-l-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [SelectedMonth-f-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [SelectedMonth-f-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [SelectedMonth-m-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [SelectedMonth-m-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [SelectedMonth-l-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [SelectedMonth-l-Total2]
FROM TB
感觉只能这样了
谢谢!
kielin 2014-11-21
  • 打赏
  • 举报
回复
解决了,谢谢你们啊
习惯性蹭分 2014-11-20
  • 打赏
  • 举报
回复


use tempdb
create table test(id int,[name] varchar(30),total1 decimal(18,6),total2 decimal(18,6),date1 smalldatetime)
insert into test
select 1,	'Name1',	8.981132,	  476	,'6/15/2014' union all
select 1,	'Name2',	9	     ,    18	,'7/9/2014'  union all
select 1,	'Name3',	14.589062,	1203.16	,'7/25/2014' union all
select 1,	'Name4',	30.750759,	2023.4	,'7/11/2014' union all
select 2,	'Name1',	7	      ,  7	    ,'6/13/2014' union all
select 2,	'Name2',	13.491984,	5714.8	,'7/22/2014' union all
select 2,	'Name2',	26.976811,	5921.68	,'7/18/2014' 

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+' sum(case when day(date1) between 1 and 10 then total1 else 0 end)  as ['+ cast(month(date1) as varchar)+'-上旬-total1],'+char(10)+
' sum(case when day(date1)>10 and day(date1)<=20 then total1 else 0 end ) as ['+ cast(month(date1) as varchar)+'-中旬-total1],'+char(10)+
' sum(case when day(date1)>20 then total1 else 0 end)  as [' +cast(month(date1) as varchar)+'-下旬-total1],'+char(10)+
' sum(case when day(date1) between 1 and 10 then total2 else 0 end)  as ['+ cast(month(date1) as varchar)+'-上旬-total2],'+char(10)+
' sum(case when day(date1)>10 and day(date1)<=20 then total2 else 0 end ) as ['+ cast(month(date1) as varchar)+'-中旬-total2],'+char(10)+
' sum(case when day(date1)>20 then total2 else 0 end ) as ['+ cast(month(date1) as varchar)+'下旬-total2]'
from test group by month(date1)

set @sql='select id,[name],'+@sql
+'from test group by id,name,convert(varchar(6),date1,112)'
--print @sql
exec(@sql)

 
还在加载中灬 2014-11-20
  • 打赏
  • 举报
回复
DECLARE @MONTH DATETIME
SET @MONTH='2014-07-01'
SELECT ID,Name
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [preSelectedMonth-f-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [preSelectedMonth-f-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [preSelectedMonth-m-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [preSelectedMonth-m-Total2]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [preSelectedMonth-l-Total1]
	,CASE WHEN MONTH(DATEADD(MONTH,1,Date1))=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [preSelectedMonth-l-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total1 END [SelectedMonth-f-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=10 THEN Total2 END [SelectedMonth-f-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total1 END [SelectedMonth-m-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)<=20 AND DATEPART(DAY,Date1)>10 THEN Total2 END [SelectedMonth-m-Total2]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total1 END [SelectedMonth-l-Total1]
	,CASE WHEN MONTH(Date1)=MONTH(@MONTH)AND DATEPART(DAY,Date1)>20 THEN Total2 END [SelectedMonth-l-Total2]
FROM TB
感觉只能这样了
kielin 2014-11-20
  • 打赏
  • 举报
回复
引用 3 楼 kielin 的回复:
[quote=引用 2 楼 ky_min 的回复:] 这样的话,后面的列名随数据在变化,只能是动态处理了,有异议吗? 你肯定不希望列名写死为6月 7月吧
是的,随数据中月份值变化。可以取为preSelectedMonth-f, preSelectedMonth-m,preSelected-l,及SelectedMonth-f,SlectedMonth-m,SelectedMonth-l [/quote] 我只需要所选月份及前一个月的数据。 sql server 2008。
kielin 2014-11-20
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
这样的话,后面的列名随数据在变化,只能是动态处理了,有异议吗? 你肯定不希望列名写死为6月 7月吧
是的,随数据中月份值变化。可以取为preSelectedMonth-f, preSelectedMonth-m,preSelected-l,及SelectedMonth-f,SlectedMonth-m,SelectedMonth-l
还在加载中灬 2014-11-20
  • 打赏
  • 举报
回复
这样的话,后面的列名随数据在变化,只能是动态处理了,有异议吗? 你肯定不希望列名写死为6月 7月吧
kielin 2014-11-20
  • 打赏
  • 举报
回复
原始数据图片

期望结果的图片:

谢谢大家。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧