有一个文件,如下:桥梁名称 详细信息
a    省略
b    省略
c    省略
d    省略
e    省略
f    省略
g    省略数据库中有一张表(tableA),记录着各个桥梁的检查日期,大致如下:桥梁名称 检查日期
c 2009-1-1
b 2009-1-2
a 2009-1-3
g 2009-1-5
b 2009-1-3
c 2009-1-4我想通过查询生成这样一个表,然后导出:
桥梁名称 2009-1-1 2009-1-2 2009-1-3 2009-1-4 2009-1-5
a                        √
b                 √       √
c        √                       √
d
e
f
g                                        √d、e、f即便没有记录也要留着
请教该如何写,我现在写出来的只能保证有记录的能查出来,d、e、f空白记录显示不出来。

解决方案 »

  1.   

    文件?你没有桥梁信息表吗?
    那怎么知道有d、e、f?
      

  2.   

    abcdef是给定的 顺序不能变 这个要硬写到sql中
      

  3.   

    --> 测试数据: [a]
    if object_id('[a]') is not null drop table [a]
    create table [a] (桥梁名称 varchar(1),详细信息 varchar(4))
    insert into [a]
    select 'a','省略' union all
    select 'b','省略' union all
    select 'c','省略' union all
    select 'd','省略' union all
    select 'e','省略' union all
    select 'f','省略' union all
    select 'g','省略'
    --> 测试数据: [tableA]
    if object_id('[tableA]') is not null drop table [tableA,:]
    create table [tableA] (桥梁名称 varchar(1),检查日期 datetime)
    insert into [tableA]
    select 'c','2009-1-1' union all
    select 'b','2009-1-2' union all
    select 'a','2009-1-3' union all
    select 'g','2009-1-5' union all
    select 'b','2009-1-3' union all
    select 'c','2009-1-4'
    declare @sql varchar(8000)
    set @sql='select a.桥梁名称'
    select @sql=@sql+',['+检查日期+']=max(case convert(varchar(10),检查日期,120) when '''+检查日期+'''
    then ''√'' else '''' end)' from (select distinct 检查日期=convert(varchar(10),检查日期,120) from [tableA])a
    set @sql=@sql+' from a left join tablea b on a.桥梁名称=b.桥梁名称 group by a.桥梁名称'
    exec(@sql)
      

  4.   

    CREATE TABLE TA([桥梁名称] VARCHAR(1), [详细信息] NVARCHAR(2))
    INSERT TA
    SELECT 'a', N'省略' UNION ALL 
    SELECT 'b', N'省略' UNION ALL 
    SELECT 'c', N'省略' UNION ALL 
    SELECT 'd', N'省略' UNION ALL 
    SELECT 'e', N'省略' UNION ALL 
    SELECT 'f', N'省略' UNION ALL 
    SELECT 'g', N'省略'CREATE TABLE TB([桥梁名称] VARCHAR(1), [检查日期] DATETIME)
    INSERT TB 
    SELECT 'c', '2009-1-1' UNION ALL 
    SELECT 'b', '2009-1-2' UNION ALL 
    SELECT 'a', '2009-1-3' UNION ALL 
    SELECT 'g', '2009-1-5' UNION ALL 
    SELECT 'b', '2009-1-3' UNION ALL 
    SELECT 'c', '2009-1-4'DECLARE @STR NVARCHAR(4000)
    SET @STR=N''
    SELECT @STR=@STR+N','+N'MAX(CASE WHEN [检查日期]='''+CONVERT(VARCHAR(10),[检查日期],120)+N''' THEN N''√'' ELSE '''' END) AS ['+CONVERT(VARCHAR(10),[检查日期],120)+']'
    FROM TB GROUP BY [检查日期]EXEC(N'SELECT TA.[桥梁名称]'+@STR+N' FROM TA LEFT JOIN TB ON TA.[桥梁名称]=TB.[桥梁名称] GROUP BY TA.[桥梁名称]')
    DROP TABLE TA,TB
    /*
    桥梁名称 2009-01-01 2009-01-02 2009-01-03 2009-01-04 2009-01-05
    ---- ---------- ---------- ---------- ---------- ----------
    a                          √                     
    b               √          √                     
    c    √                                √          
    d                                                
    e                                                
    f                                                
    g                                                √(7 row(s) affected)
    */