Sql server 2005 使用Sql查询将行转换为列

Sql server 2005 使用Sql查询将行转换为列,sql-server-2005,pivot,Sql Server 2005,Pivot,嗨,我有一个列为 Cost Rate Repair 12 Repair 223 Wear 1000 Wear 666 Fuel 500 Repair 600 Fuel 450 Wear

嗨,我有一个列为

              Cost     Rate

              Repair   12
              Repair   223
              Wear     1000    
              Wear     666
              Fuel     500
              Repair   600
              Fuel     450
              Wear     400
现在我想把这些数据作为

             Repair    Wear   Fuel
               825     2066    950
使用Sql查询

提前感谢

在使用聚合函数(如SUM)时,您可以使用来组合结果

这将返回与您要求相反的结果,但我希望这不是什么大问题

Cost SUM(Rate) --- --- Repair 825 Wear 2066 Fuel 950
选择cost,sumrate from tablename group by cost

可以使用SQL Server的操作符获得将行转换为列的循环。

我认为您正在寻找一种进行动态数据透视或动态交叉制表符的方法

检查以下物品:


您可以通过一个简单的交叉表查询来实现这一点。“访问查询”窗口中有一个向导,将指导您创建一个向导。只需单击新建查询按钮并选择交叉表查询向导。

这是一个使用该功能的简单查询。如果已知有几个值可转换为列,则可以使用静态版本:

create table yourtable
(
  cost varchar(10),
  rate int
);

insert into yourtable values
('Repair', 12),
('Repair', 223),
('Wear', 1000),
('Wear', 666),
('Fuel', 500),
('Repair', 600),
('Fuel', 450),
('Wear', 400);

select *
from
(
  select cost, rate
  from yourtable
) x
pivot
(
  sum(rate)
  for cost in ([Repair], [Wear], [Fuel])
) p;
如果值的数目未知,则可以使用动态SQL创建动态数据透视:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cost) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT ' + @cols + ' from 
             (
              select cost, rate
              from yourtable
            ) x
            pivot 
            (
                sum(rate)
                for cost in (' + @cols + ')
            ) p '

execute(@query)

看。两者将产生相同的结果。

在CASE语法中使用WHEN而不是WHERE。然后用END或END CASE终止一个CASE。啊,我在写bat,没有检查语法。我会修好的,干杯。有没有办法避免硬编码列名?当有人添加名为Brakes的行时,必须重写查询吗?PIVOT方法更通用,但没有那么简单。@Muxecoid您始终可以根据数据库的元数据风格动态生成查询。这将是一个创建域数据表的案例,其中“刹车”作为“燃料”的兄弟条目,在超级类别(如“汽车成本”)下;然后通过循环所有“汽车成本”节点生成查询。
create table yourtable
(
  cost varchar(10),
  rate int
);

insert into yourtable values
('Repair', 12),
('Repair', 223),
('Wear', 1000),
('Wear', 666),
('Fuel', 500),
('Repair', 600),
('Fuel', 450),
('Wear', 400);

select *
from
(
  select cost, rate
  from yourtable
) x
pivot
(
  sum(rate)
  for cost in ([Repair], [Wear], [Fuel])
) p;
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cost) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT ' + @cols + ' from 
             (
              select cost, rate
              from yourtable
            ) x
            pivot 
            (
                sum(rate)
                for cost in (' + @cols + ')
            ) p '

execute(@query)