SQL Server:如何将行转换为列

SQL Server:如何将行转换为列,sql,sql-server,tsql,Sql,Sql Server,Tsql,在T-SQL中,我试图将某些行的值转换为列。 初始表格: Project | Machine | Value ------------------------- A X 100 A Y 99 A Z 98 A W 97 B X 97 B Y 96 B W 95 C X 95 C Z 94 我想要的结果是: Project MX MY MZ MW ----------------------------- A

在T-SQL中,我试图将某些行的值转换为列。
初始表格:

Project | Machine | Value
-------------------------
A   X   100
A   Y   99
A   Z   98
A   W   97
B   X   97
B   Y   96
B   W   95
C   X   95
C   Z   94
我想要的结果是:

Project     MX  MY  MZ  MW
-----------------------------
A           100 99  98  97
B            97 96   0  95
C            95  0  94   0
我已经创建了测试代码:

CREATE TABLE Company (project char(1), machine char(1), cost int)
GO

INSERT INTO Company 
VALUES ('A', 'X', 100), ('A', 'Y', 99), ('A', 'Z', 98),
       ('A', 'W', 97), ('B', 'X', 97), ('B', 'Y', 96),
       ('B', 'W', 95), ('C', 'X', 95), ('C', 'Z', 94);
我的透视查询:

SELECT
    project, 'X', 'Y', 'Z', 'W'
FROM
    (SELECT 
         project, machine, cost 
     FROM 
         Company) p
PIVOT
    (MAX(cost)
        FOR machine IN ('X', 'Y', 'Z', 'W') AS  pvt
我得到这个错误:

“X”附近的语法不正确

我的pivot查询错了吗


提前感谢

如果您的计算机有限,那么我将执行条件聚合而不是透视:

SELECT Project,
       MAX(CASE WHEN machine = 'X' THEN cost END) AS MX,
       MAX(CASE WHEN machine = 'Y' THEN cost END) AS MY,
       MAX(CASE WHEN machine = 'Z' THEN cost END) AS MZ,
       MAX(CASE WHEN machine = 'W' THEN cost END) AS MW
FROM Company c
GROUP BY Project;
如果要使用
PIVOT
,则我将修复缺少右括号的语法错误:

SELECT * 
FROM (SELECT project, machine, cost 
      FROM Company 
     ) AS p PIVOT
     (MAX(cost)
      FOR machine IN ([X], [Y], [Z], [W]) 
     ) AS pvt;
注:

  • 不要使用单引号作为列名,而是使用方括号
我没有纠正你,我只是感到困惑,因为我从未在查询中看到过它,并认为我遗漏了一些很酷的东西。8-
pvt中([X]、[Y]、[Z]、[W])机器的枢轴(最大(成本)