读书人

复杂的统计!解决思路

发布时间: 2011-12-31 23:50:30 作者: rapoo

复杂的统计!!
原数据:
日期 品牌 规格 产品条码
2006-1-1 A Z 000001
2006-1-1 A Z 000002
2006-1-1 B Z 000003
... ... ... ...
要求统计格式为:根据选择的日期段(比如2006-1-1至2006-1-31)统计产品的数量:
品牌 规格 2006-1-1 2006-1-2 2006-1-3 ... 2006-1-31


[解决办法]
少条件了

declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',[ '+convert(varchar(10),日期,120)+ ']=sum(case when convert(varchar(10),日期,120)= ' ' '+convert(varchar(10),日期,120)+ ' ' ' then 1 else 0 end) '
from tablename
where 日期> = '2006-1-1 ' and 日期 < '2006-2-1 '
group by convert(varchar(10),日期,120)

exec( 'select 品牌,规格 '+@sql+ ' from tablename where 日期> = ' '2006-1-1 ' ' and 日期 < ' '2006-2-1 ' ' group by 品牌,规格 ')


[解决办法]
--如果日期是Varchar,且每天都有的

Declare @StartDate Varchar(10), @EndDate Varchar(10)
Select @StartDate = '2006-1-1 ', @EndDate = '2006-1-31 '
Declare @S Nvarchar(4000)
Select @S = N 'Select 品牌, 规格 '
Select @S = @S + ' , SUM(Case 日期 When ' ' ' + 日期 + ' ' ' Then 1 Else 0 End) As [ ' + 日期 + '] '
From TableName Where 日期 Between @StartDate And @EndDate Group By 日期
Select @S = @S + ' From TableName 日期 Between ' ' ' + @StartDate + ' ' ' And ' ' ' + @EndDate + ' ' ' Group By 品牌, 规格 '
EXEC(@S)
[解决办法]
declare @t table(日期 varchar(10),品牌 varchar(10),规格 varchar(10),产品条码 varchar(10))
insert into @t select '2006-1-1 ', 'A ', 'Z ', '000001 '
union all select '2006-1-1 ', 'A ', 'Z ', '000002 '
union all select '2006-1-1 ', 'B ', 'Z ', '000003 '

select * from @t
pivot
(count(产品条码)
for 日期 in ([2006-1-1],[2006-1-2],[2006-1-3])
) as pit

/*

品牌 规格 2006-1-1 2006-1-2 2006-1-3
---------- ---------- ----------- ----------- -----------
A Z 2 0 0
B Z 1 0 0

(2 行受影响)
*/
[解决办法]
if not object_id(N 'tb ') is null
drop table tb
go

create table tb(日期 datetime ,品牌 char(1),规格 char(1))
go

insert into tb select convert(varchar(10),getdate(),120), 'A ', 'Z '
union all
select convert(varchar(10),getdate(),120), 'A ', 'Z '
union all
select convert(varchar(10),getdate()+1,120), 'B ', 'Z '
union all
select convert(varchar(10),getdate(),120), 'B ', 'Z '

select * from tb

--执行查询
declare @Sql varchar(2000),
@BeginDate datetime,
@EndDate datetime,
@CurrDate datetime

select @BeginDate = getdate(), @EndDate = getdate()+10, @CurrDate = @BeginDate



select @Sql = ' select 品牌,规格 '
while @CurrDate <= @EndDate
begin
select @Sql = @Sql + ', sum( case when 日期 = ' ' '+convert(varchar(10),@CurrDate,120)+ ' ' ' then 1 else 0 end ) as [ '+convert(varchar(10),@CurrDate,120)+ '] '
select @CurrDate = @CurrDate +1
end

select @Sql = @Sql + ' from tb where 日期 between ' ' '+convert(varchar(10),@beginDate,120) + ' ' ' and ' ' ' +convert(varchar(10),@EndDate,120)+ ' ' ' '+
' group by 品牌,规格 '

print(@Sql)

exec(@Sql)

读书人网 >SQL Server

热点推荐