2016-02-12 51 views
1

我有以下两个查询如何使用union,以便看到无论是在单一的查询执行如何使用两个查询的联盟,通过有秩序SQL和计数()

select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
from Health 
where age = 7 
group by AGE, DIAGNOSIS_CODE_1 
order by total_count DESC; 

select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
from Health 
where age = 9 
group by AGE, DIAGNOSIS_CODE_1 
order by total_count DESC; 

样品的结果出把 enter image description here

样品出来把 enter image description here

+0

'SELECT * FROM(SELECT TOP 1 AGE,DIAGNOSIS_CODE_1,从健康 计数(DIAGNOSIS_CODE_1)作为TOTAL_COUNT 其中年龄= 7 组由AGE,DIAGNOSIS_CODE_1 UNION ALL 选择TOP 1 AGE,DIAGNOSIS_CODE_1,计数(DIAGNOSIS_CODE_1)从健康 其中年龄= 9 组按年龄,DIAGNOSIS_CODE_1 )由x.total_count X为了desc'的 –

+3

可能的复制[SQL服务器?:如何使用UNION两个查询,这两个有一个WHERE子句] TOTAL_COUNT ( http://stackoverflow.com/questions/5426767/sql-server-how-to-use-union-with-two-queries-that-both-have-a-where-clause) – venkat

+0

@Sandeep - 请给予e一些示例数据与两个查询的预期输出。 – Utsav

回答

1

只需添加UNION ALL在这些查询之间。当UNION ALL应用时,ORDER BY子句不会接受。所以我通过把它们放在内部集合中来结束它。

SELECT * FROM (

    SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT 
    FROM HEALTH 
    WHERE AGE = 7 
    GROUP BY AGE, DIAGNOSIS_CODE_1 


    UNION ALL 

    SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT 
    FROM HEALTH 
    WHERE AGE = 9 
    GROUP BY AGE, DIAGNOSIS_CODE_1 

    )AS A 
    ORDER BY TOTAL_COUNT DESC; 

根据情况你可以这样。如果您的情况是分开下单,那么您可以通过内部订单进行下单。

SELECT * FROM (

    SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT 
    FROM HEALTH 
    WHERE AGE = 7 
    GROUP BY AGE, DIAGNOSIS_CODE_1 
    ORDER BY TOTAL_COUNT DESC; 
    )AS B 

    UNION ALL 

    SELECT * FROM (
    SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, COUNT(DIAGNOSIS_CODE_1) AS TOTAL_COUNT 
    FROM HEALTH 
    WHERE AGE = 9 
    GROUP BY AGE, DIAGNOSIS_CODE_1 
    ORDER BY TOTAL_COUNT DESC; 
    )AS A 
+0

这将不会对两个年龄组 – Utsav

+0

但他在这里的问题是不同的,我认为desc'条款给'最大age'用'为了获取作为.. @Utsav但是我们不能incluse ORDER BY像移动视图里面.. –

+0

这就是为什么我们应该等待OP提供样本数据,否则很难假设事情。 – Utsav

2

您可以通过row_number() over(partition by..喜欢这样做,

select 
    AGE, 
    DIAGNOSIS_CODE_1, 
    total_count 
from (
    select 
     AGE, 
     DIAGNOSIS_CODE_1, 
     count(DIAGNOSIS_CODE_1) as total_count, 
     row_number() over (partition by AGE order by count(DIAGNOSIS_CODE_1) desc) rnk 
    from Health 
    where age in (7, 9) 
    group by AGE, DIAGNOSIS_CODE_1 
) x 
where rnk = 1 

或者你可以使用union all等;

with tmp_1 as (
    select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
    from Health 
    where age = 7 
    group by AGE, DIAGNOSIS_CODE_1 
    order by total_count DESC 
), 
tmp_2 as (
    select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
    from Health 
    where age = 9 
    group by AGE, DIAGNOSIS_CODE_1 
    order by total_count DESC 
) 
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_1 
union all 
select AGE, DIAGNOSIS_CODE_1, total_count from tmp_2 
+0

太棒了。它的工作感谢.. – Sandeep

+0

我想我们可以用你的1岁之间的20第一个解决方案?如果我们按照第二个解决方案查询变得越来越大。如果有办法让我知道如何去做。 – Sandeep

+0

变化,其中从在(7,9)''年龄为'年龄> 1和年龄<条件20' – Praveen

0

如果您想使用联合,您可以尝试以下查询。

(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
from Health 
where age = 7 
group by AGE, DIAGNOSIS_CODE_1) union 
(select TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
from Health 
where age = 9 
group by AGE, DIAGNOSIS_CODE_1) order by total_count DESC; 

对于这个特定的查询,我建议您使用where age IN (7,9)这将减少工作量。

+0

这TOTAL_COUNT给NULL。 – Sandeep

+0

oops。我把关键部分弄错了。看起来我们已经有了一些很好的解决方案。干杯 –

0

当UNION语句中的任何SELECT语句包含ORDER BY子句时,该子句应放置在所有SELECT语句之后。 Using UNION of two SELECT statements with ORDER BY

SELECT * FROM (
         SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
         FROM Health 
         WHERE Age = 7 
         GROUP BY AGE, DIAGNOSIS_CODE_1 

        UNION ALL  

         SELECT TOP 1 AGE, DIAGNOSIS_CODE_1, count(DIAGNOSIS_CODE_1) as total_count 
         FRPM Health 
         WHERE Age = 9 
         GROUP BY AGE, DIAGNOSIS_CODE_1 
) AS T 

ORDER BY total_count DESC; 
0

你必须使用类似的东西。我不使用工会,但得到2个不同年龄组的计数,然后选择其中最大计数

SQLFiddle Demo

SELECT t1.age, 
     t1.diagnosis_code_1, 
     t1.total_count 
FROM (SELECT t.*, 
       Rank() 
       OVER ( 
        partition BY age 
        ORDER BY total_count DESC) AS tc 
     FROM (SELECT age, 
         diagnosis_code_1, 
         Count(diagnosis_code_1) AS total_count 
       FROM health 
       WHERE age IN (7, 9) 
       GROUP BY age, 
          diagnosis_code_1 
       ) t 
     ) t1 
WHERE t1.tc = 1 

您可以使用相同的查询,修改或删除WHERE age IN (7, 9)子句,以获得count更多age组。