2016-02-12 48 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組。