城市名称为列标题

时间:2014-06-09 08:01:01

标签: sql pivot

我有两张桌子。

Food Table
--------------------------
ID     CityID    FoodName
--------------------------
1      1         FoodA
2      1         FoodB
3      1         FoodC
4      2         FoodW
5      2         FoodX
6      2         FoodY
7      2         FoodZ

City Table
--------------------------
ID     CityName
--------------------------
1      Memphis
2      Nashville
3      Chattanooga

那么如何使用 CityName 作为列标题并列出该城市的食物。

--------------------------------------
Memphis     Nashville     Chattanooga
--------------------------------------
FoodA       FoodW         
FoodB       FoodX
FoodC       FoodY
            FoodZ

我很确定我必须使用枢轴,但我还没找到一个好的解决方案。 这是我到目前为止所取得的成就。

SELECT *
FROM (
    SELECT *
    FROM Food F
    INNER JOIN City C ON C.ID = F.CityID
    ) DataTable D
PIVOT(F.FoodName FOR C.CityName IN (
            [Memphis]
            ,[Nashville]
            ,[Chattanooga]
            )) PivotTable 

2 个答案:

答案 0 :(得分:1)

您可以使用此查询来获取输出。实际上你在设置数据透视查询时犯了一些错误。

select Memphis,Nashville,Chattanooga 
from
(
  select f.ID,c.CityName,f.FoodName 
  from Food f 
  inner join City c 
   on f.CityID=c.id
)result 
pivot
(
  max(FoodName) 
  for CityName in(Memphis,Nashville,Chattanooga)
) as pvt

答案 1 :(得分:0)

PIVOT运算符使用数据表中PIVOT定义中不属于GROUP锚点的列。
这意味着当两个值在数据表的列中具有相同的值时,它们将位于PIVOT表的同一行中,这些值既不是聚合的,也不是聚合的。
OP数据不具有此值,因此会生成新的分区ID。

SELECT Memphis, Nashville, Chattanooga
FROM   (SELECT c.CityName, f.FoodName 
             , FoodID = Row_Number() OVER (PARTITION BY c.ID ORDER BY FoodName)
        FROM   Food f
               INNER JOIN City c ON f.CityID = c.id) d 
       PIVOT
       (MAX(FoodName) FOR CityName IN (Memphis,Nashville,Chattanooga)) pvt