如下图所示
1.列转行之前的图:
2.列转行之后的图:
本来样品名称、采样时间、分析项目名称、分析值、指标条件、指标结果这些列都是按正常的方式显示(全是列)。
现在我有这样的需求
样品名称、采样时间还是把它当成列不变,但是把分析项目名称、分析值、指标条件、指标结果这些列当作行来显示。
这sql语句咋写啊?急求。PS:图片用的国外的空间,可能显示比较慢,大家耐心等待下。多谢。~!
1.列转行之前的图:
2.列转行之后的图:
本来样品名称、采样时间、分析项目名称、分析值、指标条件、指标结果这些列都是按正常的方式显示(全是列)。
现在我有这样的需求
样品名称、采样时间还是把它当成列不变,但是把分析项目名称、分析值、指标条件、指标结果这些列当作行来显示。
这sql语句咋写啊?急求。PS:图片用的国外的空间,可能显示比较慢,大家耐心等待下。多谢。~!
1:列转行之前
样品名称 采样时间 分析项目名称 分析值 指标条件 指标结果
石脑油 8:00 c1 0.1 c1<0.2 不合格
c2 0.2 c1<0.3 不合格
c3 0.3 c1<0.4 不合格
c4 0.4 c1<0.5 不合格
c5 0.5 c1<0.6 不合格
… 0.6 c1<0.7 不合格
9:00 c1 0.1 c1<0.2 不合格
c2 0.2 c1<0.3 不合格
c3 0.3 c1<0.4 不合格
c4 0.4 c1<0.5 不合格
c5 0.5 c1<0.6 不合格
… 0.6 c1<0.7 不合格
采样时间 分析项目名称 分析值 指标条件 指标结果
液化气 8:00 y1
y2 不合格
y3 1.3 c1<0.4 不合格
y4 1.4 c1<0.5 不合格
y5 1.5 c1<0.6 不合格
… 1.6 c1<0.7 不合格
9:00 y1 1.1 c1<0.2 不合格
y2 1.2 c1<0.3 不合格
y3 1.3 c1<0.4 不合格
y4 1.4 c1<0.5 不合格
y5 1.5 c1<0.6 不合格
… 1.6 c1<0.7 不合格
2:列转行之后:
样品名称 采样时间 c1 c2 c3 c4 c5 …
石脑油 8:00 0.1 0.2 0.3 0.4 0.5 0.6
c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6 c1<0.7
不合格 不合格 不合格 不合格 不合格 不合格
9:00 c1 c2 c3 c4 c5 …
c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6 c1<0.7
不合格 不合格 不合格 不合格 不合格 不合格
液化气 采样时间 y1 y2 y3 y4 y5 …
8:00 1.1 1.2 1.3 1.4 1.5 1.6
c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6 c1<0.7
不合格 不合格 不合格 不合格 不合格 不合格
9:00 y1 y2 y3 y4 y5 …
c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6 c1<0.7
不合格 不合格 不合格 不合格 不合格 不合格
PS:很久没来了。不晓得这些人还在不
insert into tb values('石脑油', '8:00', 'c1', '0.1', 'c1<0.2', '不合格')
insert into tb values('石脑油', '8:00', 'c2', '0.2', 'c1<0.3', '不合格')
insert into tb values('石脑油', '8:00', 'c3', '0.3', 'c1<0.4', '不合格')
insert into tb values('石脑油', '8:00', 'c4', '0.4', 'c1<0.5', '不合格')
insert into tb values('石脑油', '8:00', 'c5', '0.5', 'c1<0.6', '不合格')
insert into tb values('石脑油', '9:00', 'c1', '0.1', 'c1<0.2', '不合格')
insert into tb values('石脑油', '9:00', 'c2', '0.2', 'c1<0.3', '不合格')
insert into tb values('石脑油', '9:00', 'c3', '0.3', 'c1<0.4', '不合格')
insert into tb values('石脑油', '9:00', 'c4', '0.4', 'c1<0.5', '不合格')
insert into tb values('石脑油', '9:00', 'c5', '0.5', 'c1<0.6', '不合格')
godeclare @sql varchar(8000)
set @sql = 'select 样品名称,采样时间 '
select @sql = @sql + ' , max(case 分析项目名称 when ''' + 分析项目名称 + ''' then cast(分析值 as varchar) else '''' end) [' + 分析项目名称 + ']'
from (select distinct 分析项目名称 from tb) as a
set @sql = @sql + ' from tb group by 样品名称,采样时间'set @sql = @sql + ' union all select 样品名称,采样时间 '
select @sql = @sql + ' , max(case 分析项目名称 when ''' + 分析项目名称 + ''' then cast(指标条件 as varchar) else '''' end) [' + 分析项目名称 + ']'
from (select distinct 分析项目名称 from tb) as a
set @sql = @sql + ' from tb group by 样品名称,采样时间'set @sql = @sql + ' union all select 样品名称,采样时间 '
select @sql = @sql + ' , max(case 分析项目名称 when ''' + 分析项目名称 + ''' then cast(指标结果 as varchar) else '''' end) [' + 分析项目名称 + ']'
from (select distinct 分析项目名称 from tb) as a
set @sql = @sql + ' from tb group by 样品名称,采样时间 order by 样品名称,采样时间'exec(@sql) drop table tb/*
样品名称 采样时间 c1 c2 c3 c4 c5
---------- ---------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
石脑油 8:00 0.1 0.2 0.3 0.4 0.5
石脑油 8:00 c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6
石脑油 8:00 不合格 不合格 不合格 不合格 不合格
石脑油 9:00 0.1 0.2 0.3 0.4 0.5
石脑油 9:00 c1<0.2 c1<0.3 c1<0.4 c1<0.5 c1<0.6
石脑油 9:00 不合格 不合格 不合格 不合格 不合格*/
但是样品名称和采样时间重复啦,我只想显示一条记录就行。
样品名称 采样时间 c1 c2
石脑油 8:00 0.1 0.2
c<0.2 c2<0.2
... .....类似上面我画的这样
declare @t table(序号 int,货物 varchar(10),数量 int)
insert into @t
select 1 , 'A' , 30 union
select 2 , 'a' , 10 union
select 3 , 'a' , -5 union
select 4 , 'B' , 20 union
select 5 , 'b' , 100 union
select 6 , 'C' , 1 union
select 7 , 'c' , 98 select 序号,case when 序号=(select min(序号) from @t where 货物=a.货物) then 货物 else '' end as 货物, 数量
from @t a
order by 序号/*
序号 货物 数量
----------- ---------- -----------
1 A 30
2 10
3 -5
4 B 20
5 100
6 C 1
7 98(所影响的行数为 7 行)*/