【问题标题】:Pivot query in Microsoft SQL serverMicrosoft SQL Server 中的透视查询
【发布时间】:2014-08-14 08:43:23
【问题描述】:

我是 sql server 的新手,过去几天我一直在尝试将 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    

感谢阅读。

最好的,

手动

【问题讨论】:

  • “不运行”是什么意思?您有任何错误信息要与我们分享吗? 您在哪里选择透视列? (您在外部查询中列出了原始字段而不是透视字段)

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


【解决方案1】:

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

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 中可能不需要这样做,这里有。

【讨论】:

  • 感谢您的帮助。运行查询时,我得到:Msg 207,Level 16,State 1,Line 2 Invalid column name 'colDate'。我尝试了 dbo.tblDefHolidays.colDate 但这并没有解决问题。
  • 嗯,我没有注意到,但由于源中只有 2 个字段,所以 pivot on 确实没有任何内容,请通过从 select 子句中删除 collat​​e 来尝试(如上现在)。让我知道发生什么事。使用任何错误消息编辑此答案(不要使用评论)
  • 我知道你想要一个额外的行,但我只能猜测这会起作用。
  • 好的,现在停止编辑答案 - 我建议只针对错误消息,它不起作用 - 所以请使用 cmets
猜你喜欢
  • 2013-06-06
  • 2012-11-13
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多