如何使用Pivot水平显示sql数据

时间:2015-08-18 07:17:10

标签: sql sql-server pivot

我附上了sql查询和结果表的截图,这里我将查看表格Horizo​​ntal。

喜欢

| iFruit | iPlant | Pat on the back | The Incredebles |

| 2 | 1 | 1 | 1 |

请帮助我编写枢轴功能以获得上述格式。

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以按以下顺序编写查询。

Select iFruit, iPlant, [Pat on the Back], [The Incredibles] 
 from (select r.award_name as Awardname, 
   count(r.award_name) as Awardcount
   from associate_L_award p, asociate_information q, award_list r
   where p.Id = q.id
   and p.award_no = r.award_no
   and q.id='290007'
   group by r.award_name) as S
 Pivot
 (
   sum (AwardCount)
   for AwardName in (iFruit, iPlant, [Pat on the Back], [The Incredibles]) 
 ) as pvt

示例:

temp table

注意:如果您的基本查询返回更多奖励名称,则必须在此查询中手动添加它们。另外,如果您的奖励名称中有空格,例如“背面拍”,请将该字符串括在“[]”中。

编辑:经过大量的RnD后,我得到了解决方案。
场景:主要返回的行数(它们依次成为枢轴中的列)不是固定的,它们是动态的。 解决方案:

  1. 创建SELECT * INTO #temp FROM (SELECT r.award_name AS Awardname, Count(r.award_name) AS Awardcount FROM associate_l_award p, asociate_information q, award_list r WHERE p.id = q.id AND p.award_no = r.award_no AND q.id = '290007' GROUP BY r.award_name) AS S 以存储主查询的输出。然而 这不是强制性的,您可以随时使用主查询 需要。但是从性能和可读性的角度来看,您可以使用 临时表。
  2. DECLARE @str NVARCHAR(1000) 
    DECLARE @sql NVARCHAR(1000)      
    SELECT @str = COALESCE(@str+',', '') + awardname 
    FROM   #temp 
    
    SET @sql = N'select ' + @str + ' from (SELECT Awardname, Awardcount FROM #temp) as S 
    Pivot 
    (   
      sum(Awardcount)   
      for Awardname in (' + @str + ')  
    )as pvt;'
    
    1. 编写以下一组查询以构建您的透视查询。
    2. EXECUTE Sp_executesql @sql
      1. 现在您只需执行以下命令即可获得所需的结果。
      2.   

        {{1}}