如何在具有 order by 和 count() 的 SQL 中使用两个查询的并集

How to use union of two queries in SQL that has order by and count()

我有以下两个查询 我如何使用 union 以便在单个查询执行中看到两个结果

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;

样本输出

样本输出

只需在这些查询之间添加 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;

根据情况可以走这条路。如果您的情况是单独下单,则可以in inner set下单。

    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

您可以通过 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

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

(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),这样可以减少工作量。

当 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;

你必须使用这样的东西。我没有使用 union,而是计算 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 ) 子句以获得更多 age 组的 count