如下图所示
1.列转行之前的图:
2.列转行之后的图:
本来样品名称、采样时间、分析项目名称、分析值、指标条件、指标结果这些列都是按正常的方式显示(全是列)。
现在我有这样的需求
样品名称、采样时间还是把它当成列不变,但是把分析项目名称、分析值、指标条件、指标结果这些列当作行来显示。
这sql语句咋写啊?急求。PS:图片用的国外的空间,可能显示比较慢,大家耐心等待下。多谢。~!

解决方案 »

  1.   

    sofa不留
      

  2.   

    行,
    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
    不合格 不合格 不合格 不合格 不合格 不合格
      

  3.   

    F姐,树哥,龟兄,还有啥嫂的。来看看吧。
    PS:很久没来了。不晓得这些人还在不
      

  4.   

    create table tb(样品名称 varchar(10),采样时间 varchar(10),分析项目名称 varchar(10), 分析值 varchar(10) , 指标条件 varchar(10) , 指标结果 varchar(10))
    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       不合格                            不合格                            不合格                            不合格                            不合格*/
      

  5.   

    多谢乌龟,大致看下,好像满足要求,
    但是样品名称和采样时间重复啦,我只想显示一条记录就行。
    样品名称  采样时间  c1      c2
    石脑油    8:00      0.1    0.2
                        c<0.2  c2<0.2
                        ...      .....类似上面我画的这样
                       
      

  6.   

    因你的列名是动态的,做起来太困难,相关方法参考:
    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 行)*/