我有很多想要组合成单个查询的查询,即使它们有一个共同的过滤字段,我也不能完全确定我想要实现的是甚至是可能的,因为这些都是聚合查询
declare @salesforceId int
set @salesforceId = 109924
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 1 --general feedback
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 3 --food rating
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 4 --drinks rating
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 5 -- restaurant ambience
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 6 -- service rating
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 7 -- booking service
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 12 -- Recommend Restaurant
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 13 -- Overall Rating
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 525 -- Value for Money
AND sr.RestaurantNetworkId = @salesforceId
SELECT
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND qr.QuestionId = 526 -- Location
AND sr.RestaurantNetworkId = @salesforceId
SELECT
count(*) as Total,
CultureInvariantText AS Tag
FROM
SurveyResponse SR
INNER JOIN
[QuestionResponseFixedOptions] QR ON SR.SurveyResponseId = QR.SurveyResponseId
INNER JOIN
QuestionResponseOption QRO ON QR.[ResponseOptionId] = QRO.[ResponseOptionId]
INNER JOIN
Question Q ON QRO.QuestionId = Q.QuestionId
INNER JOIN
LocalizableText LT ON QRO.ResponseValue = LT.LocalizableTextId
where sr.RestaurantNetworkId = @salesforceId
group by CultureInvariantText
输出可以是以下内容: 所有查询的计数都相同。
|GeneralFeedback|FoodRating|....|.....|....|Count|
答案 0 :(得分:1)
如果他们都访问同一个表,则应该进行条件聚合:
AVG(CAST CASE WHEN <condtion> THEN qr.RatingScaleOptionId END as float)
您可以在自己的SELECT
条款中包含尽可能多的内容。只需确保只保留WHERE
子句中的常见条件。然后,变化的条件属于WHEN
的{{1}}。
在这里阅读更多相关信息: https://modern-sql.com/feature/filter
答案 1 :(得分:0)
您可以添加代理列以告知行代表哪个聚合,格式化每个查询以生成相同的行,并使用UNION ALL
组合它们:
SELECT 'GeneralFeedback' AS Type, AVG(...) AS Rating, COUNT(*) AS ReviewCount
FROM QuestionResponse ...
UNION ALL
SELECT 'FoodRating' AS Type, AVG(...) AS Rating, COUNT(*) AS ReviewCount
FROM QuestionResponse ...
...
UNION ALL
SELECT 'Total' as Type, 0 as Rating, COUNT(*) as ReviewCount
FROM SurveyResponse ...
'Total'
的行是&#34;鞋带&#34;通过添加评级为零的列并调用Total
一个ReviewCount
进入公共结构。执行此查询的代码将需要特殊处理来将此行与从查询返回的其他行分开处理。
答案 2 :(得分:0)
试试这个。请注意,我更改了decimal
的 float 。 您将获得更好的精确度,具体取决于您所使用的应用程序类型。
您需要根据~10个案例确定查询。
SELECT AVG( CASE WHEN qr.QuestionId = 1 THEN CAST(qr.RatingScaleOptionId as decimal) END as GeneralFeedback_Rating
, COUNT(CASE WHEN qr.QuestionId = 1 THEN 1 END) as GeneralFeedback_Count
, AVG( CASE WHEN qr.QuestionId = 3 THEN CAST(qr.RatingScaleOptionId as decimal) END as Food_Rating
, COUNT(CASE WHEN qr.QuestionId = 3 THEN 1 END) as Food_Count
, AVG( CASE WHEN qr.QuestionId = 4 THEN CAST(qr.RatingScaleOptionId as decimal) END as Drinks_Rating
, COUNT(CASE WHEN qr.QuestionId = 4 THEN 1 END) as Drinks_Count
-- ... ... ...
FROM QuestionResponse qr
JOIN SurveyResponse sr
ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND sr.RestaurantNetworkId = @salesforceId
AND qr.QuestionId IN (1, 3, 4)--1:general feedback, 3:food, 4:drinks, ETC...
答案 3 :(得分:0)
尝试分组
declare @salesforceId int
set @salesforceId = 109924
SELECT qr.QuestionId,
AVG(CAST(qr.RatingScaleOptionId as float)) as Rating,
COUNT(*) as ReviewCount
FROM QuestionResponse qr
JOIN SurveyResponse sr ON qr.SurveyResponseId = sr.SurveyResponseId
AND sr.StatusId IN (5, 7)
AND sr.RestaurantNetworkId = @salesforceId
group by qr.QuestionId