sql按组分组合2个不同顺序的查询

时间:2015-01-02 10:25:32

标签: sql sql-server

我有一个查询,我在数据库中计算最频繁的响应并按最高金额排序,因此使用group by和order by。

以下显示如何为一个人执行此操作:

select health, count(health) as count 
from [Health].[Questionaire] 
group by Health 
order by count(Health) desc

输出以下内容:

Health       Count
-----------  -----
Very Good    6
Good         5
Poor         4

我想在同一个表上用另一个列做另一个类似下面的查询,所以两个查询使用一个sql语句,如下所示:

Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    6        Very Good   6
Good         5        Good        4
Poor         4        Poor        3

UPDATE !!

你好,这就是目前表格的样子

ID           Diet              Health      
-----------  -----             -------       
101          Very Good         Very Good   
102          Poor              Good        
103          Poor              Poor        

我想在同一个表上用另一个列做另一个类似下面的查询,所以两个查询使用一个sql语句,如下所示:

Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    2        Very Good   1
Poor         1        Good        1
Good         0        Poor        1

任何人都可以帮我解决这个问题吗? 如果需要,可以提供进一步的说明!

2 个答案:

答案 0 :(得分:2)

以下是两种不同的方法,请注意我删除了冗余列:

测试数据:

DECLARE @t table(Health varchar(20), Diet varchar(20))
INSERT @t values
('Very good', 'Very good'),
('Poor', 'Good'),
('Poor', 'Poor')

查询1:

;WITH CTE1 as
(
  SELECT Health, count(*) CountHealth
  FROM @t --[Health].[Questionaire] 
  GROUP BY health
), CTE2 as
(
  SELECT Diet, count(*) CountDiet
  FROM @t --[Health].[Questionaire] 
  GROUP BY Diet
)
SELECT 
  coalesce(Health, Diet) Grade, 
  coalesce(CountHealth, 0) CountHealth, 
  coalesce(CountDiet, 0) CountDiet
FROM CTE1
FULL JOIN
CTE2
ON CTE1.Health = CTE2.Diet
ORDER BY CountHealth DESC

结果1:

Grade     CountHealth  CountDiet
Poor      2            1
Very good 1            1
Good      0            1

混合这样的结果实际上并不是一个好习惯,所以这里有一个不同的解决方案

查询2:

SELECT Health, count(*) Count, 'Health' Grade
FROM @t --[Health].[Questionaire] 
GROUP BY health
UNION ALL
SELECT Diet, count(*) CountDiet, 'Diet'
FROM @t --[Health].[Questionaire] 
GROUP BY Diet
ORDER BY Grade, Count DESC

结果2:

Health     Count Grade
Good       1     Diet
Poor       1     Diet
Very good  1     Diet
Poor       2     Health
Very good  1     Health

答案 1 :(得分:0)

您需要将表连接到自身,但(如示例数据所示)处理特定值的实际数据中的差距。

如果您的餐桌有健康/饮食价值范围:

select
  v.value Status,
  count(a.id) healthCount,
  count(b.id) DietCount
from health_diet_values v
left join Questionaire a on a.health = v.value
left join Questionaire b on b.diet = v.value
group by v.value

或者如果您没有这样的表,则需要手动生成值列表并从中加入:

select
  v.value Status,
  count(a.id) healthCount,
  count(b.id) DietCount
from (select 'Very Good' value union all
      select 'Good' union all
      select 'Poor') v
left join Questionaire a on a.health = v.value
left join Questionaire b on b.diet = v.value
group by v.value

如果该值没有匹配数据,则这两个查询都会生成零。

请注意,在所需的输出中,您有一个冗余列 - 重复值列。上面的查询产生的输出如下:

Status    HealthCount DietCount
-------------------------------
Very Good           2         1
Good                1         1
Poor                0         1