如何基于SQL Server中的行创建多个列

时间:2013-01-26 08:46:56

标签: sql sql-server sql-server-2008

我有一张名为Attendance Master的表格

id  ||name ||attn_hours || attn_date
---------------------------------------------
142 || abc || 2.00 || 2013-01-17 00:00:00.000
142 || abc || 3.00 || 2013-01-18 00:00:00.000
143 || pqr || 3.00 || 2013-01-17 00:00:00.000
143 || pqr || 2.00 || 2013-01-18 00:00:00.000

我想在多列中使用不同的名称和出勤时间,列名称为attn_date 以下

id  ||name ||2013-01-17||2013-01-18
---------------------------------
142 || abc || 2.00 || 3.00
143 || pqr || 3.00 || 2.00

请帮忙

提前致谢。

3 个答案:

答案 0 :(得分:0)

您需要透视数据。在sql server 2008中,您可以按照指南@ http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

执行此操作

然后你可以理解为什么会这样:http://sqlfiddle.com/#!3/3f8a3/1/0

答案 1 :(得分:0)

试试这个:

SELECT
  Id, name, [2013-01-17], [2013-01-18]
FROM Tbl
PIVOT
(
  MAX(attn_hours)
  FOR attn_date in ([2013-01-17], [2013-01-18])
) A

或者这个:

SELECT
  Id, 
  name,
  MAX(CASE WHEN attn_date = '2013-01-17' THEN attn_hours END) [2013-01-17],
  MAX(CASE WHEN attn_date = '2013-01-18' THEN attn_hours END) [2013-01-18]
FROM Tbl
GROUP BY Id, Name

<强> SQL FIDDLE DEMO

答案 2 :(得分:0)

试试这个:

DECLARE @Dates VARCHAR(8000)
Declare @Month int=1

SELECT @Dates = COALESCE(@Dates + '], [', '') + cast(attn_date as varchar(20)) FROM 
(select distinct attn_date from tbl where month(attn_date)=@Month) as a


Set @Dates='['+@Dates+']'

--SELECT @Dates




Declare @query varchar(max)


Set @query=
'SELECT
Id, name, ' + @Dates + ' 
FROM Tbl
PIVOT
(
  MAX(attn_hours)
  FOR attn_date in (' + @Dates + ' )   
) A'

print @query

exec(@query)