【问题标题】:Pivot Table from Three Tables without Aggregate从三个没有聚合的表的数据透视表
【发布时间】:2013-05-10 23:34:53
【问题描述】:

对我缺乏这方面的知识表示歉意,我在这里和其他地方进行了研究,但遇到了障碍(我的大脑)。我正在尝试在这样的表格中显示别墅的价格:

                SPRING     SUMMER     FALL      WINTER    MAX GUESTS
2 Rooms         $343       $288       $389      $467      2
3 Rooms         $456       $415       $536      $756      4
Whole Villa     $809       $789       $906      $1023     6

我认为 PIVOT 可以解决我的问题。我在 MS Server 2008 R2 上使用 SQL Server 2008

季节、套餐和价格存储在 3 个表格中,如下所示:

CONFIGURATIONS
--------------
configurationID
configurationName
maximumGuests

SEASONS
-------
seasonID
seasonName

CONFIGURATIONSEASONRATES
------------------------
seasonID
configurationID
price

根据我能找到的示例,我已经做到了这一点:

SELECT 'Packages', 'Summer', 'Winter', 'Christmas', 'Tropical'

FROM

(SELECT     ACCOMMODATION_configurations.configurationName, price
FROM         ACCOMMODATION_configurations INNER JOIN
                      ACCOMMODATION_configurationSeasonRates ON 
                      ACCOMMODATION_configurations.configurationID = ACCOMMODATION_configurationSeasonRates.configurationID INNER JOIN
                      ACCOMMODATION_seasons ON ACCOMMODATION_configurationSeasonRates.seasonID = ACCOMMODATION_seasons.seasonID) as somethingNice

PIVOT (sum(price) for ACCOMMODATION_configurations.configurationName IN (['Summer'],['Winter'],['Christmas'],['Tropical'])) as anyThing

但我收到一个错误提示

列前缀“ACCOMMODATION_configurations”与查询中使用的表名或别名不匹配

然后我尝试用 SELECT ACCOMMODATION_configurations.configurationName 替换 SELECT 'Packages' 但后来我被告知:

SELECT ACCOMMODATION_configurations.configurationName 无法绑定

提前感谢您的帮助!

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    在您的 PIVOT 语法中,您需要删除 ACCOMMODATION_configurations。同时删除 FOR 中值周围的单引号,您需要将 Packages 列添加到内部选择。

    所以代码是:

    -- this select will display the packages and the seasons
    SELECT Packages, Summer, Winter, Christmas, Tropical
    FROM
    (
      -- add Packages to this select list
      SELECT Packages, ac.configurationName, price
      FROM ACCOMMODATION_configurations ac
      INNER JOIN ACCOMMODATION_configurationSeasonRates sr
        ON ac.configurationID = sr.configurationID 
      INNER JOIN ACCOMMODATION_seasons s
        ON sr.seasonID = s.seasonID
    ) as somethingNice
    PIVOT 
    (
      sum(price) 
      for configurationName IN ([Summer],[Winter],[Christmas],[Tropical])
    ) as anyThing
    

    编辑,根据您的评论,您可能想要:

    -- this select will display the packages and the seasons
    SELECT Packages, Summer, Winter, Christmas, Tropical
    FROM
    (
      SELECT ac.configurationName as Packages, price, seasonName
      FROM ACCOMMODATION_configurations ac
      INNER JOIN ACCOMMODATION_configurationSeasonRates sr
        ON ac.configurationID = sr.configurationID 
      INNER JOIN ACCOMMODATION_seasons s
        ON sr.seasonID = s.seasonID
    ) as somethingNice
    PIVOT 
    (
      sum(price) 
      for seasonName IN ([Summer],[Winter],[Christmas],[Tropical])
    ) as anyThing
    

    【讨论】:

    • 非常感谢您看这个!我收到一个错误,这取决于我不清楚 - “包”只是一个任意词(不是真正的列),我用于第一列的标题(其中包含行中的“配置名称”)。在上面的示例中,我在网格中留下了空白,但不确定是否可行。您是如何设法吸收所有这些东西并如此快速地处理它的?!
    • (忘了说,我得到的错误是'Invalid column name 'Packages')
    • @MrFett Summer 等是季节还是配置名称?
    • 'Summer' 是一个季节名称。这非常成功 - 非常感谢! :-)
    • 再次感谢。在某些时候,我还需要弄清楚如何动态更新列(季节),但是我会为此创建一个单独的问题!另一方面,我有一个未来的复杂项目,你可以租用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多