Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将多行转换为标题为同一行的列_Sql_Sql Server 2008 - Fatal编程技术网

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)