Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql按分组组合2个不同顺序的查询_Sql_Sql Server - Fatal编程技术网

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

sql按分组组合2个不同顺序的查询,sql,sql-server,Sql,Sql Server,我有一个查询,我正在计算数据库中最频繁的响应,并使用GROUPBY和ORDERBY按最高数量对它们进行排序 下面显示了如何为一个用户执行此操作: select health, count(health) as count from [Health].[Questionaire] group by Health order by count(Health) desc 其输出如下: Health Count ----------- ----- Very Good 6 Go

我有一个查询,我正在计算数据库中最频繁的响应,并使用GROUPBY和ORDERBY按最高数量对它们进行排序

下面显示了如何为一个用户执行此操作:

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
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    6        Very Good   6
Good         5        Good        4
Poor         4        Poor        3
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    2        Very Good   1
Poor         1        Good        1
Good         0        Poor        1
我希望使用同一表上的另一列执行另一个类似于以下内容的查询,因此使用一个sql语句执行两个查询,如下所示:

Health       Count
-----------  -----
Very Good    6
Good         5
Poor         4
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    6        Very Good   6
Good         5        Good        4
Poor         4        Poor        3
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    2        Very Good   1
Poor         1        Good        1
Good         0        Poor        1
更新

你好,这是桌子现在的样子

ID           Diet              Health      
-----------  -----             -------       
101          Very Good         Very Good   
102          Poor              Good        
103          Poor              Poor        
我希望使用同一表上的另一列执行另一个类似于以下内容的查询,因此使用一个sql语句执行两个查询,如下所示:

Health       Count
-----------  -----
Very Good    6
Good         5
Poor         4
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    6        Very Good   6
Good         5        Good        4
Poor         4        Poor        3
Health       Count    Diet       Count
-----------  -----   -----       -----
Very Good    2        Very Good   1
Poor         1        Good        1
Good         0        Poor        1
谁能帮我解决这个问题吗?
如果需要,可以提供进一步的澄清

这里有两种不同的方法,注意我删除了冗余列:

测试数据:

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

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

如果您有一个包含健康/饮食值范围的表格:

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

你能举一个不同值的例子吗?比如饮食计数,你说的是VG1,G5和P7?然后像你一样排列价值观spect?基本上这是一个调查,人们回答问题,所以当我计算时,是有多少人说他们的饮食很好,好或差,所以大多数人(6人)说他们的饮食是好的,我这样问是因为根据价值观的不同,价值观的顺序会因麦加主义的顺序而不同。它是按列顺序排列的,所以如果您告诉它对第一个计数列进行排序,无论第二个计数列是什么,它都会先对该列进行排序。如果你告诉它按两个计数列排序,它会按第一列排序,考虑到第二列会弄乱你的顺序。对不起,我不太明白你说的是什么,你是说不可能使用计数两次吗?或者很难正确解决这个问题,我们需要更多关于表格的信息。例如,你从哪里得到你的饮食信息?这是非常糟糕的。发帖前你试过了吗?@t-c不,我没有试过-SQL小提琴坏了。但你为什么说这是“严重的糟糕”?主要是看最后一部分,没有在“v”和“1,3”中的子选择中命名列?那是什么?好的,除此之外似乎还管用。“太严重了”有点苛刻。@t-c啊,是的-我添加了缺少的列名。谢谢。“1,3”是group by和order by子句的SQL标准,用于按位置而不是表达式列出列(只是更容易阅读)@Grax,除非它是SQL server 2008之后的新功能。您可以对列编号使用order by,但不能使用group by