--
> 测试数据:[tb]
if object_id ( ' [tb] ' ) is not null drop table [ tb ]
go
create table [ tb ] ( [ 姓名 ] varchar ( 1 ), [ 部门 ] varchar ( 4 ), [ 学历 ] varchar ( 4 ), [ 出生年月 ] datetime )
insert [ tb ]
select ' A ' , ' 后勤 ' , ' 高中 ' , ' 1986-1-1 ' union all
select ' B ' , ' 后勤 ' , ' 初中 ' , ' 1984-3-7 ' union all
select ' C ' , ' 管理 ' , ' 本科 ' , ' 1987-2-1 ' union all
select ' D ' , ' 操作 ' , ' 专科 ' , ' 1976-2-1 ' union all
select ' E ' , ' 操作 ' , ' 专科 ' , ' 1943-2-1 '
-- ------------开始查询--------------------------
declare @sql varchar ( 8000 )
set @sql = ' select 部门,dbo.AgeLevel([出生年月]) as 年龄段 '
select @sql = @sql + ' , sum(case 学历 when ''' + 学历 + ''' then 1 else 0 end) [ ' + 学历 + ' ] '
from ( select distinct 学历 from tb) as a
set @sql = @sql + ' from tb group by 部门,dbo.AgeLevel([出生年月]) '
exec ( @sql )
/*
部门 年龄段 本科 初中 高中 专科
---- ---------- ----------- ----------- ----------- -----------
管理 21-30 1 0 0 0
后勤 21-30 0 1 1 0
操作 31-40 0 0 0 1
操作 50以上 0 0 0 1
(4 行受影响)
*/
drop function AgeLevel
go
-- 获取年龄段
create function AgeLevel( @birthday datetime )
returns varchar ( 10 )
as
begin
declare @AgeLevel varchar ( 10 )
select @AgeLevel = case (( datediff ( year , @birthday , getdate ()) - 1 ) / 10 ) when 2 then ' 21-30 ' when 3 then ' 31-40 ' when 4 then ' 41-50 ' else ' 50以上 ' end
return @AgeLevel
end
go
select * ,dbo.AgeLevel( [ 出生年月 ] ) as 年龄段 from tb
/*
姓名 部门 学历 出生年月 年龄段
---- ---- ---- ----------------------- ----------
A 后勤 高中 1986-01-01 00:00:00.000 21-30
B 后勤 初中 1984-03-07 00:00:00.000 21-30
C 管理 本科 1987-02-01 00:00:00.000 21-30
D 操作 专科 1976-02-01 00:00:00.000 31-40
E 操作 专科 1943-02-01 00:00:00.000 50以上
*/
select N ' 年龄段 ' = (
case (( datediff ( year , [ 出生年月 ] , getdate ()) - 1 ) / 10 )
when 2 then ' 21-30 '
when 3 then ' 31-40 '
when 4 then ' 41-50 '
else ' 50以上 '
end ),
count ( * ) as count
from tb
group by (
case (( datediff ( year , [ 出生年月 ] , getdate ()) - 1 ) / 10 )
when 2 then ' 21-30 '
when 3 then ' 31-40 '
when 4 then ' 41-50 '
else ' 50以上 '
end )
/*
年龄段 count
------ -----------
21-30 3
31-40 1
50以上 1
(3 行受影响)
*/
-- 以10岁为递增
select
cast (f1 * 10 + 1 as varchar ( 3 )) + ' - ' + cast (f1 * 10 + 10 as varchar ( 3 )) as 年龄段,f2 as 人数
from
(
select datediff (d, [ 出生年月 ] , getdate ()) / 365 / 10 as f1,
count ( * ) as f2
from tb
group by datediff (d, [ 出生年月 ] , getdate ()) / 365 / 10 ) a
order by cast (f1 * 10 + 1 as varchar ( 3 )) + ' - ' + cast (f1 * 10 + 10 as varchar ( 3 ))
/*
年龄段 人数
------- -----------
21-30 3
31-40 1
61-70 1
(3 行受影响)
*/
SELECT
SUM (
CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 16 AND 20 THEN 1 ELSE 0 END ) AS ' 16-20 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 21 AND 30 THEN 1 ELSE 0 END ) AS ' 21-30 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 31 AND 40 THEN 1 ELSE 0 END ) AS ' 31-40 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 41 AND 50 THEN 1 ELSE 0 END ) AS ' 41-50 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 51 AND 60 THEN 1 ELSE 0 END ) AS ' 51-60 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 61 AND 70 THEN 1 ELSE 0 END ) AS ' 61-70 '
FROM tb
/*
16-20 21-30 31-40 41-50 51-60 61-70
----------- ----------- ----------- ----------- ----------- -----------
0 3 1 0 0 1
(1 行受影响)
*/
b.产品数量,
a. [ brand ] ,
a. [ address ]
from brands a,
( select [ brand ] ,
count ( [ brand ] )产品数量
from products
group by [ brand ] )b
where a. [ ID ] = b. [ brand ]
order by b.产品数量 desc
select b.id,b1.cnt as 产品数量,b.brand,b.address
from brands b
join
(
select brand, count (brand) cnt
from products
group by brand
) b1
on b1.brand = b.id
id 产品数量 brand address
-- --------- ----------- ------------------------------ ------------------------------
1 4 联想 北京
2 2 惠普 美国
3 1 神舟 深圳
( 3 行受影响)
if object_id ( ' [tb] ' ) is not null drop table [ tb ]
go
create table [ tb ] ( [ 姓名 ] varchar ( 1 ), [ 部门 ] varchar ( 4 ), [ 学历 ] varchar ( 4 ), [ 出生年月 ] datetime )
insert [ tb ]
select ' A ' , ' 后勤 ' , ' 高中 ' , ' 1986-1-1 ' union all
select ' B ' , ' 后勤 ' , ' 初中 ' , ' 1984-3-7 ' union all
select ' C ' , ' 管理 ' , ' 本科 ' , ' 1987-2-1 ' union all
select ' D ' , ' 操作 ' , ' 专科 ' , ' 1976-2-1 ' union all
select ' E ' , ' 操作 ' , ' 专科 ' , ' 1943-2-1 '
-- ------------开始查询--------------------------
declare @sql varchar ( 8000 )
set @sql = ' select 部门,dbo.AgeLevel([出生年月]) as 年龄段 '
select @sql = @sql + ' , sum(case 学历 when ''' + 学历 + ''' then 1 else 0 end) [ ' + 学历 + ' ] '
from ( select distinct 学历 from tb) as a
set @sql = @sql + ' from tb group by 部门,dbo.AgeLevel([出生年月]) '
exec ( @sql )
/*
部门 年龄段 本科 初中 高中 专科
---- ---------- ----------- ----------- ----------- -----------
管理 21-30 1 0 0 0
后勤 21-30 0 1 1 0
操作 31-40 0 0 0 1
操作 50以上 0 0 0 1
(4 行受影响)
*/
drop function AgeLevel
go
-- 获取年龄段
create function AgeLevel( @birthday datetime )
returns varchar ( 10 )
as
begin
declare @AgeLevel varchar ( 10 )
select @AgeLevel = case (( datediff ( year , @birthday , getdate ()) - 1 ) / 10 ) when 2 then ' 21-30 ' when 3 then ' 31-40 ' when 4 then ' 41-50 ' else ' 50以上 ' end
return @AgeLevel
end
go
select * ,dbo.AgeLevel( [ 出生年月 ] ) as 年龄段 from tb
/*
姓名 部门 学历 出生年月 年龄段
---- ---- ---- ----------------------- ----------
A 后勤 高中 1986-01-01 00:00:00.000 21-30
B 后勤 初中 1984-03-07 00:00:00.000 21-30
C 管理 本科 1987-02-01 00:00:00.000 21-30
D 操作 专科 1976-02-01 00:00:00.000 31-40
E 操作 专科 1943-02-01 00:00:00.000 50以上
*/
select N ' 年龄段 ' = (
case (( datediff ( year , [ 出生年月 ] , getdate ()) - 1 ) / 10 )
when 2 then ' 21-30 '
when 3 then ' 31-40 '
when 4 then ' 41-50 '
else ' 50以上 '
end ),
count ( * ) as count
from tb
group by (
case (( datediff ( year , [ 出生年月 ] , getdate ()) - 1 ) / 10 )
when 2 then ' 21-30 '
when 3 then ' 31-40 '
when 4 then ' 41-50 '
else ' 50以上 '
end )
/*
年龄段 count
------ -----------
21-30 3
31-40 1
50以上 1
(3 行受影响)
*/
-- 以10岁为递增
select
cast (f1 * 10 + 1 as varchar ( 3 )) + ' - ' + cast (f1 * 10 + 10 as varchar ( 3 )) as 年龄段,f2 as 人数
from
(
select datediff (d, [ 出生年月 ] , getdate ()) / 365 / 10 as f1,
count ( * ) as f2
from tb
group by datediff (d, [ 出生年月 ] , getdate ()) / 365 / 10 ) a
order by cast (f1 * 10 + 1 as varchar ( 3 )) + ' - ' + cast (f1 * 10 + 10 as varchar ( 3 ))
/*
年龄段 人数
------- -----------
21-30 3
31-40 1
61-70 1
(3 行受影响)
*/
SELECT
SUM (
CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 16 AND 20 THEN 1 ELSE 0 END ) AS ' 16-20 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 21 AND 30 THEN 1 ELSE 0 END ) AS ' 21-30 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 31 AND 40 THEN 1 ELSE 0 END ) AS ' 31-40 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 41 AND 50 THEN 1 ELSE 0 END ) AS ' 41-50 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 51 AND 60 THEN 1 ELSE 0 END ) AS ' 51-60 ' ,
SUM ( CASE WHEN datediff ( year , [ 出生年月 ] , getdate ()) BETWEEN 61 AND 70 THEN 1 ELSE 0 END ) AS ' 61-70 '
FROM tb
/*
16-20 21-30 31-40 41-50 51-60 61-70
----------- ----------- ----------- ----------- ----------- -----------
0 3 1 0 0 1
(1 行受影响)
*/
create
table
brands(id
int
,brand
varchar
(
10
), address
varchar
(
10
))
insert into brands values ( 1 , ' 联想 ' , ' 北京 ' )
insert into brands values ( 2 , ' 惠普 ' , ' 美国 ' )
insert into brands values ( 3 , ' 神舟 ' , ' 深圳 ' )
create table products(id int , brand int , name varchar ( 10 ))
insert into products values ( 1 , 1 , ' 联想1 ' )
insert into products values ( 2 , 1 , ' 联想2 ' )
insert into products values ( 3 , 2 , ' 惠普1 ' )
insert into products values ( 4 , 2 , ' 惠普2 '
insert into brands values ( 1 , ' 联想 ' , ' 北京 ' )
insert into brands values ( 2 , ' 惠普 ' , ' 美国 ' )
insert into brands values ( 3 , ' 神舟 ' , ' 深圳 ' )
create table products(id int , brand int , name varchar ( 10 ))
insert into products values ( 1 , 1 , ' 联想1 ' )
insert into products values ( 2 , 1 , ' 联想2 ' )
insert into products values ( 3 , 2 , ' 惠普1 ' )
insert into products values ( 4 , 2 , ' 惠普2 '
) insertinto products values(5 ,1, '联想3')
insertinto products values(6 ,3, '神舟1')
insertinto products values(7 ,1, '联想4')
go
select ID = row_number() over ( order by getdate ()),
b.产品数量,
a. [ brand ] ,
a. [ address ]
from brands a,
( select [ brand ] ,
count ( [ brand ] )产品数量
from products
group by [ brand ] )b
where a. [ ID ] = b. [ brand ]
order by b.产品数量 desc
select b.id,b1.cnt as 产品数量,b.brand,b.address
from brands b
join
(
select brand, count (brand) cnt
from products
group by brand
) b1
on b1.brand = b.id
id 产品数量 brand address
-- --------- ----------- ------------------------------ ------------------------------
1 4 联想 北京
2 2 惠普 美国
3 1 神舟 深圳
( 3 行受影响)
select
sum(
case
when ( 字段名
>
0
and 字段名
<
4000)
then
1
else
0
end) 别名,
sum( case when 字段名 >= 4000 and 字段名 < 8000 then 1 else 0 end) 别名,
sum( case when 字段名 >= 8000 then 1 else 0 end) 别名 ,
count( *) as total
sum( case when 字段名 >= 4000 and 字段名 < 8000 then 1 else 0 end) 别名,
sum( case when 字段名 >= 8000 then 1 else 0 end) 别名 ,
count( *) as total
from 表名
本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2010/02/04/1663468.html,如需转载请自行联系原作者