在Microsoft SQL Server中进行透视查询

时间:2014-08-14 08:43:23

标签: sql sql-server database ms-access pivot

我是sql服务器的新手,我在过去几天一直在尝试将Access中的简单TRANSFORM查询转换为SQL Server。

在访问中,查询如下所示:

TRANSFORM tblDefHolidays.colDate
SELECT    tblDefHolidays.colDate
FROM      tblDefHolidays
WHERE     tblDefHolidays.colDate >= DateAdd ("d", -60, date()) 
          AND tblDefHolidays.colDate <= DateAdd ("yyyy",2, date())
GROUP BY  tblDefHolidays.colDate
ORDER BY  tblDefHolidays.colCal DESC 
PIVOT     tblDefHolidays.colCal;

在SQL Server中,表tblDefHolidays定义如下:

colCal          nvarchar(40)    
colDate         date    
colCodeBB       nvarchar(20)    
colDesc         nvarchar(255)

这是我当前未运行的SQL Server查询。

SELECT colDate, colCal
FROM 
(
   SELECT dbo.tblDefHolidays.colDate, dbo.tblDefHolidays.colCal
   FROM   dbInv.dbo.tblDefHolidays) as [subTable]
PIVOT
(  max(colDate)
   FOR  dbInv.dbo.tblDefHolidays.colCal
    IN ([OSAKA],[LIFFE],[HKEX],[EUREX],[CME],[CBOE])
) as [pivotTable]

当运行当前的sql server查询时,我得到:

  

Msg 107,Level 15,State 1,Line 9列前缀   'dbInv.dbo.tblDefHolidays'与表名或别名不匹配   查询中使用的名称。消息207,级别16,状态1,行2无效   列名'colDate'。

结果(来自Access)应如下所示:

 colDate         OSAKA         LIFFE         HKEX        EUREX      CME       CBOE
 7/1/2014                  7/1/2014         
 7/4/2014                  7/4/2014      7/4/2014
 7/21/2014  7/21/2014                   
 8/25/2014  8/25/2014               
 9/1/2014                  9/1/2014      9/1/2014
 9/9/2014                  9/9/2014         
 9/15/2014  9/15/2014                   
 9/23/2014  9/23/2014                   
 10/1/2014                 10/1/2014    

感谢阅读。

最佳,

Manu

1 个答案:

答案 0 :(得分:1)

请尝试以下方法。在SourceTable子查询之后,您不应再通过dbInv.dbo.tblDefHolidays引用字段,别名SourceTable接管

SELECT
      [OSAKA]
    , [LIFFE]
    , [HKEX]
    , [EUREX]
    , [CME]
    , [CBOE]
FROM (
            SELECT
                  dbo.tblDefHolidays.colDate
                , dbo.tblDefHolidays.colCal
            FROM dbInv.dbo.tblDefHolidays
      ) AS SourceTable
      PIVOT
      (
      MAX(colDate)
      FOR colCal IN ([OSAKA], [LIFFE], [HKEX], [EUREX], [CME], [CBOE])
      ) AS PivotTable
;

尝试使用冗余列的变体(不要生气,技术上多余)

SELECT
      displayDt
    , [OSAKA]
    , [LIFFE]
    , [HKEX]
    , [EUREX]
    , [CME]
    , [CBOE]
FROM (
            SELECT
                  convert(varchar,dbo.tblDefHolidays.colDate,101) as displayDt
                , dbo.tblDefHolidays.colDate
                , dbo.tblDefHolidays.colCal
            FROM dbInv.dbo.tblDefHolidays
      ) AS SourceTable
      PIVOT
      (
      MAX(colDate)
      FOR colCal IN ([OSAKA], [LIFFE], [HKEX], [EUREX], [CME], [CBOE])
      ) AS PivotTable
ORDER BY
      displayDt
;

我已经猜到该日期栏的MM / DD / YYYY样式101。

您应该能够添加引用select子句中的字段的order by子句 见:BOL

没有命名列(OSAKA,LIFFE等)没有办法构建查询 在Access中可能没有必要这样做,这里有。