【问题标题】:Creating pivot table from SQL query从 SQL 查询创建数据透视表
【发布时间】:2018-09-26 15:22:19
【问题描述】:

我有一个返回以下结果的 SQL 查询:

数据来自返回酒店住宿调查数据的视图。如果您看到 Question 列包含 5 个不同的值,这些值针对每个报告编号重复。因此,Question 中针对每个报告编号有 5 个单独的条目。 Answer 列包含列中每个条目的值。我正在尝试创建一个报告,其中 Question 列中的每个条目都将转换为 5 个单独的列,并且值将是来自 Answer 的条目,如下所示:

我搜索了可行的解决方案,因为我对 SQL 不是很熟悉,并了解了数据透视表以及如何使用数据透视表将组转换为列。但我无法理解如何创建一个。

我找到了一些解释 herehere 但两者似乎都像是报表生成器的配置细节。不知道如何使用 sql 查询来做到这一点。

任何帮助都会很棒!

【问题讨论】:

  • 你有没有尝试过?您需要做的就是复制代码,将其替换为您的表名和列名。然后看看情况如何。如果它不起作用,请在此处发布代码。如果你还没有这样做,那就开始工作吧。

标签: sql-server tsql pivot-table ssrs-2012


【解决方案1】:

您可以尝试如下,我认为有一列包含城市、酒店 .. 值的值

select * from 
(
select * from query
) src
pivot
 (max(values) for Question in ([City],[Hotel],[Rating],[Comments],[TransportationMode])
 ) pvt

【讨论】:

  • 是的,我很抱歉没有放那个专栏。有一列城市的值,....
【解决方案2】:

您可以尝试以下查询:

 SELECT DISTINCT t.ReportNumber, t.Datecreated, t.Name, p.City, p.Hotel, p.Rating,
 p.Comments, p.TransportationMode
 FROM tablename t
 PIVOT (MAX(Datecreated)
 FOR Question IN ([City], [Hotel], [Rating], [Comments], [TransportationMode])) AS P

【讨论】:

  • 我收到一条错误消息,提示“无法绑定多部分标识符”列 t.ReportNumber、t.Datecreated、t.Name。
  • @Naphstor 调试是程序员工作的一部分。给你一个解决方案。当您收到错误并且错误非常清楚时,您可以进行调试。您的表tablename 上是否有列ReportNumberDateCreatedName?如果没有,那是你的问题。
【解决方案3】:

你可以通过条件聚合得到想要的输出:

declare @tmp table(
    ReportNumber int, 
    Datecreated  date, 
    Name         varchar(50), 
    Question     varchar(50),
    Answer       varchar(50) 
)

insert into @tmp values 
 (123, '2018-04-24', 'Shane', 'City'               ,'Dallas')
,(123, '2018-04-24', 'Shane', 'Hotel'              ,'Marriott')
,(123, '2018-04-24', 'Shane', 'Rating'             ,'Green')
,(123, '2018-04-24', 'Shane', 'Comments'           ,'Very Good')
,(123, '2018-04-24', 'Shane', 'TransportationMode' ,'Van')
,(124, '2018-04-24', 'Ralph', 'Hotel'              ,'Houston')
,(124, '2018-04-24', 'Ralph', 'City'               ,'Hilton')
,(124, '2018-04-24', 'Ralph', 'Rating'             ,'Yellow')
,(124, '2018-04-24', 'Ralph', 'Comments'           ,'Decent')
,(124, '2018-04-24', 'Ralph', 'TransportationMode' ,'Van')

select ReportNumber, Datecreated, 
 max(case when Question='City'               then Answer else '' end) as City,
 max(case when Question='Hotel'              then Answer else '' end) as Hotel,
 max(case when Question='Rating'             then Answer else '' end) as Rating,
 max(case when Question='Comments'           then Answer else '' end) as Comments,
 max(case when Question='TransportationMode' then Answer else '' end) as TransportationMode
from @tmp 
group by ReportNumber, Datecreated

结果:

【讨论】:

  • 谢谢安德里亚,我更新了这个问题。原来的表只有我现在添加的一列。因此,有一个 Question 列和 Answer 列,其中包含关于 Question 列中每个条目的值。数据来自视图。
  • @Naphstor 感谢您的澄清,我根据新规范更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2021-01-19
  • 2019-07-22
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多