1

我在访问中有下表(odbc 链接到实际的 mssql 表) 桌子

我可以创建表的交叉表查询以将其转换为这种格式 交叉表

access中生成的sql如下:

TRANSFORM First(dbo_85137_PHY_Long_MP.[StatColumnValue]) AS FirstOfStatColumnValue
SELECT dbo_85137_PHY_Long_MP.[StatDate]
FROM dbo_85137_PHY_Long_MP
GROUP BY dbo_85137_PHY_Long_MP.[StatDate]
PIVOT dbo_85137_PHY_Long_MP.[StatColumnName];

我试图在 mssql 中创建相同的 sql 无济于事(试图创建一个视图)

4

1 回答 1

5

由于您使用的是 SQL Server,因此您将需要使用PIVOT运算符。您可以通过静态 PIVOT 或动态 PIVOT 两种方式执行此操作。

静态PIVOT意味着您将为需要旋转的每一列编码。因为看起来你有很多专栏,我怀疑你会想要这样做。但代码将与此类似:

create table t1
(
  statno int,
  statdate datetime,
  statcolumnname varchar(50),
  statcolumnvalue int
)

insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP00-1MA', 17)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP01-1MA', 18)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP02-1MA', 18)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP03-1MA', 18)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP10-1ME', 26)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP11-1ME', 2)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP12-1ME', 2)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP08-2MC', 2)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP09-2MC', 22)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP0A-2MC', 22)
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP0B-2MC', 22)

select *
from 
(
  select statdate, statcolumnname, statcolumnvalue
  from t1
) x
pivot
(
  min(statcolumnvalue)
  for statcolumnname in ([MPB-1MA.MP00-1MA], [MPB-1MA.MP01-1MA], [MPB-1MA.MP02-1MA])
) p

这是一个带有工作示例的SQL Fiddle 。

如果您有很多列,那将非常麻烦。因此,您还可以使用Dynamic Pivot,它会在您运行查询时生成要旋转的列列表。这是代码:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) 
            FROM t1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT statdate, ' + @cols + ' from 
            (
                select statdate, statcolumnname, statcolumnvalue
                from t1
           ) x
            pivot 
            (
                 min(statcolumnvalue)
                for statcolumnname in (' + @cols + ')
            ) p '


execute(@query)

他们都会给你同样的结果。

于 2012-05-25T12:15:30.207 回答