Sql 将多行转换为标题为同一行的列
我有一个表格,其中包含公寓的详细信息-该表格的内容类似于以下内容:Sql 将多行转换为标题为同一行的列,sql,sql-server-2008,Sql,Sql Server 2008,我有一个表格,其中包含公寓的详细信息-该表格的内容类似于以下内容: | flat | description | Amount | Date -------------------------------------- | flat1 | electricity | 1 |1/1/2016 | flat1 | water | 2 |1/1/2016 | flat1 | levy | 3
| flat | description | Amount | Date
--------------------------------------
| flat1 | electricity | 1 |1/1/2016
| flat1 | water | 2 |1/1/2016
| flat1 | levy | 3 |1/1/2016
| flat2 | electricity | 1 |1/1/2016
| flat2 | water | 2 |1/1/2016
| flat2 | levy | 3 |1/1/2016
我需要一个SQL视图,可以生成如下内容,如有任何帮助,将不胜感激:
| Flat | electricity | water|levy | next description| and so on |
---------------------------------------------------------------
| flat1 | 1 | 2 | 3 | next amount | next amount |
| flat2 | 1 | 2 | 3 | next amount | next amount |
这称为表
数据透视。假设您知道潜在列的数量,这里有一个使用条件聚合的选项:
select flat,
max(case when description = 'electricity' then amount end) electricity,
max(case when description = 'water' then amount end) water,
max(case when description = 'levy' then amount end) levy
from yourtable
group by flat
如果您不知道最大列数,请查阅dynamic pivot
——这里有很多关于如何执行此操作的示例:
您可以通过在@query部分中放置WHERE子句来添加日期过滤器。i、 e.从“2016年1月1日”到“2016年3月1日”之间的临时日期开始
谢谢,它在小数据库上工作,当我使用大数据库时,它会一直超时。请帮助她--在平面、描述和数量字段上添加索引可能会使您受益。与大多数与绩效相关的问题一样,这取决于许多不同的因素。请注意,在分组依据之前,我如何在同一表格中的两个日期之间进行筛选。请参阅我的答案,了解允许您筛选日期的动态wa
drop table #temp
create table #temp (flat varchar(5), description varchar(128), amount int, date datetime)
insert into #temp (flat, description, amount, date) values
('flat1','electricity',1,'1/1/2016'),
('flat1','water',2,'1/1/2016'),
('flat1','levy',3,'1/1/2016'),
('flat2','electricity',1,'1/1/2016'),
('flat2','water',2,'1/1/2016'),
('flat2','levy',3,'1/1/2016')
select * from #temp
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(description)
FROM #temp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT flat, ' + @cols + ' from
(select flat,amount, description from #temp) x
pivot
(
max(amount)
for description in (' + @cols + ')
) p '
execute(@query)