2014-09-19 39 views
1

對不起,我之前問這個問題,並得到了一些很好的答案,但後來我意識到我犯了一個錯誤的問題,如果我改變了原來的帖子中的問題這可能會使答案無效,所以我再次發佈正確的查詢,請原諒我,我希望這是可以接受的。合併兩個查詢與不同的地方和不同的分組到1

DECLARE @Temp TABLE 
(MeasureDate, col1, col2, type) 

INSERT INTO @Temp 
SELECT MeasureDate, col1, col2, 1 
FROM Table1 
WHERE Col3 = 1 

INSERT INTO @Temp 
SELECT MeasureDate, col1, col2, 3 
FROM Table1 
WHERE Col3 = 1 
AND Col4 = 7000 

SELECT SUM(col1)/SUM(col2) AS Percentage, MeasureDate, Type 
FROM @Temp 
GROUP BY MeasureDate, Type 

我做兩插入到臨時表中,第二個插入一個額外的WHERE但相同的列相同的表,但不同類型的,然後我在臨時表做SUM(COL1)/ SUM(COL2)返回我需要每個MeasureDate和類型的結果。有沒有辦法將所有這些插入和選擇合併到一個語句中,因此我不使用臨時表並從Table1執行單個選擇?或者,即使我仍然需要臨時表,將選擇合併到一個選擇而不是兩個單獨的選擇?存儲過程正常工作,只是尋找縮短它的方法。

謝謝。

+1

使用工會... – xQbert 2014-09-19 13:35:28

+0

是的,感謝,沒想到這一點。 – artm 2014-09-19 13:48:12

回答

3

當然可以。我可能會使用UNION ALL(的UNION這種變化不會刪除重複項)合併從插入兩個查詢開始,在CTE包裹起來,從中可以執行你的最終查詢:

WITH MeasureData(MeasureDate, col1, col2, type) AS (
    SELECT MeasureDate, col1, col2, 1 
    FROM Table1 
    WHERE Col3 = 1 
    UNION ALL 
    SELECT MeasureDate, col1, col2, 3 
    FROM Table1 
    WHERE Col3 = 1 
    AND Col4 = 7000 
) 
SELECT SUM(col1)/SUM(col2) AS Percentage, MeasureDate, Type 
FROM MeasureData 
GROUP BY MeasureDate, Type 

就是這樣,沒有更多的表變量或插入語句。

+1

nit:因爲在前兩個查詢之間顯然不存在任何重複,所以'union'和'union all'會產生相同的結果,儘管union all **應該稍微快一點。 – Mureinik 2014-09-19 13:37:48

+0

抓住你們倆。編輯 – 2014-09-19 13:38:31

+0

@Cory這看起來不錯,謝謝。你覺得像我這樣的SP更容易調試嗎?因爲在每次插入之後,我可以從@@ temp中執行select *,並在調用exec SP時查看@@ temp中的內容。在開發時,我發現測試/調試查詢類似的查詢有點困難,儘管它是運行查詢的一種高級方式。 – artm 2014-09-19 13:43:42

3

UNION沒有真正的需要,你可以用一個CASE聲明處理這個問題:

SELECT SUM(col1)/SUM(col2) AS Percentage, MeasureDate, Type 
FROM (
    SELECT MeasureDate, col1, col2, case when Col4 = 7000 then 3 else 1 end type 
    FROM Table1 
    WHERE Col3 = 1 
) t 
GROUP BY MeasureDate, Type 

編輯,戈登正確地指出,對Type = 1,該查詢不會產生相同的結果。下面是可能會更容易直觀地瞭解使用CROSS JOINIF邏輯上登的好答案的偏差:

SELECT T1.MeasureDate, 
    T.Type, 
    SUM(IF(T.Type=1,Col1,IF(T.Type=3 AND T1.Col4=7000,T1.Col1,0)))/
    SUM(IF(T.Type=1,Col2,IF(T.Type=3 AND T1.Col4=7000,T1.Col2,0))) AS Percentage 
FROM Table1 T1 
    CROSS JOIN (SELECT 1 Type UNION SELECT 3) T 
WHERE T1.Col3 = 1 
GROUP BY T1.MeasureDate, T.Type 
+1

這會產生與原始查詢不同的結果,因爲'col3 = 1和col4 = 7000'的值不是以這種方式重複計算的。 – 2014-09-19 13:55:55

2

你的方法是重複計算的情況下,col3 = 1col4 = 7000,下面是對整個表考慮到了這,不union的方法:

select t.type, SUM(t1.col1)/SUM(t1.col2) AS Percentage, t1.MeasureDate, t.Type 
from table1 t1 join 
    (select 1 as type union all 
     select 3 as type 
    ) t 
    on t.type = 1 or t1.col4 = 7000 
where t1.col3 = 1 
group by measuredate, type; 
+0

+1 - 我不認爲這是OP的目標,但是肯定的是,你是對的。感謝您指出。 – sgeddes 2014-09-19 14:41:07

相關問題