查找相同的行,将结果组合在多个表中

时间:2016-07-05 07:52:18

标签: sql sql-server

所以,我的问题标题可能不正确,但我需要一些帮助来解决这个问题。

所以给你画画。我在MSSQL中制作了以下模型(目前忽略SR_表):

enter image description here

要简短;此处输入的数据用于生成有关我工作的公司航班上客户满意度的报告。我必须在Excel中生成基于以下内容的报告:

  • 这一周的平均评分,今年的航班是什么?
  • 同一时期的平均评分是什么?在前一年的同一条路线上是什么?
  • 今年基于这一周的调查数量是多少?
  • 根据前一周,前一年有多少次调查?

我必须为(目前)13个问题做这件事。这将是一个很长的报告,但这就是他们要求的。以下是Excel中的示例:

enter image description here

现在,我开始对如何解决我需要为数据库进行的查询感到有些不知所措。我有这样的结果:

enter image description here

第一批是从今年开始的(我知道它说2013年我们仍在迁移先前系统的数据),第二批来自前一年。现在,前一年没有任何与本年度任何航班相似的数据,因此它们将在报告中被丢弃,而不计算在内。就是这样。但是从今年的批次中,您会注意到其中2个航班是相同的航线。这意味着我必须得到这两个航班指向的所有调查(SurveyData-> Surveys-> AnswersRating)并将它们放在一起,以便在最后将它们视为一个航班。

我无法弄清楚我是如何在SQL中解决这个问题的,这样我就可以找到相同的路线并将它们与前一年的路线配对(如果有的话),但在我配对之前,将他们的调查放在一起以便对待它们作为一条单一路线。

如果我查询AnswersRating表以获取该航班上客户填写的调查的所有答案,您会看到以下内容:

enter image description here

目前,对于每13个问题,您有1个调查,但实际上您在右侧看到的所有问题只能在调查中出现一次。

我希望我对自己的问题很清楚。关于我如何去做的任何线索?

2 个答案:

答案 0 :(得分:1)

为什么不通过cte使用相同的路线评估所有ID,然后获取此/上一年的详细信息?可能看起来像这样:

WITH cte AS(
  SELECT ID
    FROM ...
    GROUP BY AirportFrom, AirportTo
    [Where...]
)
SELECT *
  FROM ... AS a
  JOIN cte AS b ON a.id = b.id

答案 1 :(得分:1)

您需要使用相关查询。

例如:同一时间段的平均评分是多少,在前一年的同一条路线上是什么?

此解决方案可能不完全正确,但它会指示您如何解决它。

Select AVG(rating), Flightperiod, FlightID
from Answersrating ar
join Surveys s on s.ID = ar.surveryID
join SurveryData sd on s.surveyDataID = sd.ID
where Flightperiod = (Select Flightperiod 
                      from SurveyData sd2 
                      where sd.flightID = sd2.flightID 
                        and Flightperiod = DATEADD(year, 1 ,CurDate())) --today 1 year ago. You might need to alter this date to suit your needs.

这将返回每个航班(ID)的AVG评级,但是航程期是一年前。