有一个文件,如下:桥梁名称 详细信息
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空白记录显示不出来。
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空白记录显示不出来。
那怎么知道有d、e、f?
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)
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)
*/