Sql server Microsoft Access交叉选项卡查询-转换为MSSQL视图

Sql server Microsoft Access交叉选项卡查询-转换为MSSQL视图,sql-server,ms-access,transform,pivot,crosstab,Sql Server,Ms Access,Transform,Pivot,Crosstab,access中有下表(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_

access中有下表(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,但没有任何效果(尝试创建视图)

因为您使用的是sql Server,所以您需要使用操作员。您可以通过两种方式完成此操作,即通过静态轴或动态轴

静态轴意味着您将为需要旋转的每个列编码。既然你有很多专栏,我怀疑你会不会想这样做。但代码与此类似:

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
下面是一个示例

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

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)

它们都会给你相同的结果

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

静态轴意味着您将为需要旋转的每个列编码。既然你有很多专栏,我怀疑你会不会想这样做。但代码与此类似:

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
下面是一个示例

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

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)

它们都会给你相同的结果

您需要的通常称为PIVOT查询,MySQL本机不支持这种查询。这个问题可能会帮助你开始,但对你来说,这将是一个难听的问题:@Andrew He在任何地方都没有提到MYSQL!给我再来点咖啡,老板!我发誓…你想要的通常被称为PIVOT查询,而MySQL本身并不支持。这个问题可能会帮助你开始,但对你来说,这将是一个难听的问题:@Andrew He在任何地方都没有提到MYSQL!给我再来点咖啡,老板!我可以发誓…你那里有一些非常聪明的人。谢谢你的回答。超级有用!!!顺便说一下,关于您的动态轴心示例。我可以把它创建为一个存储过程,或者我可以重用它的东西吗?是的,你可以把它放在一个存储过程中,这样你就可以重用它。你可以看到一些非常聪明的人。谢谢你的回答。超级有用!!!顺便说一下,关于您的动态轴心示例。我是否可以将其创建为存储过程或可以重复使用的东西?是的,您可以将其放置在存储过程中,以便可以重复使用它。