2012-03-12 69 views
2

我在下面寫了兩個查詢,每個查詢產生一行數據。水平連接兩個查詢

什麼是最好的方式來組合它們,使我只有一行數據的LEFT

這些都是未來 databases命名:ASN01]和[dsi_ASN_dsicx]

我70對這樣的數據庫,但我只顯示一個簡單性。

三字母首字母縮寫詞ASN在兩個數據庫名稱中都是通用的這一事實沒有錯,如果需要可以成爲解決方案的一部分。

當前結果:

網站,Elligence(標題) ASN,100.00

網站,GP_Total(標題) ASN,120.00

期望的結果:

網站,GP_Total, Elligence(header) ASN,120.00,100.00

SELECT 'ASN' AS Site , 
     CASE SUM(perdblnc) 
      WHEN NULL THEN 0 
      ELSE -1 * SUM(PERDBLNC) 
     END AS GP_Total 
FROM [ASN01].[dbo].[GL10110] T1 
     LEFT OUTER JOIN [ASN01].[dbo].[GL00105] T2 ON [T1].[ACTINDX] = [T2].[ACTINDX] 
WHERE YEAR1 = 2012 
     AND PERIODID IN ('2') 
     AND ACTNUMST IN ('4200-0000-C', '6940-0000-C', '6945-0000-C', 
          '6950-0000-C') 

SELECT 'ASN' AS [Site] , 
     SUM(pi.amount) AS [Elligence] 
FROM [dsi_ASN_dsicx].dbo.charge c 
     LEFT JOIN [dsi_ASN_dsicx].dbo.paymentitem pi ON c.idcharge = pi.chargeid 
     LEFT JOIN [dsi_ASN_dsicx].dbo.payment p ON pi.paymentid = p.idpayment 
     LEFT JOIN [dsi_ASN_dsicx].dbo.paymenttype pt ON p.paymenttypeid = pt.idpaymenttype 
WHERE pi.amount != 0 
     AND pt.paymentmethod NOT IN ('5', '7') 
     AND pt.paymentmethod IS NOT NULL 
     AND p.sdate >= '20120201' 
     AND p.sdate <= '20120229' 
+0

這看起來像兩組不同的數據。什麼定義了一個共同的行?這些查詢甚至產生相同數量的行嗎? – Paparazzi 2012-03-13 00:10:17

+0

它在帖子中說,他只收到每個查詢@Blam的一行。他希望他們加入一行。 – ImGreg 2012-03-13 02:36:47

回答

5

無需通過並更改任何查詢,最簡單的方法就是使用"WITH" common_table_expression來使用臨時表。表1和表2是從您的select語句創建的臨時表。因此,我們選擇table1並連接table2。

讓我知道是否有任何語法問題,目前我沒有任何測試。

;With Table1 as (SELECT 'ASN' as Site, Case sum(perdblnc) 
WHEN NULL THEN 0 
ELSE -1*sum(PERDBLNC) END as GP_Total 
FROM [ASN01].[dbo].[GL10110] T1 
Left Outer Join [ASN01].[dbo].[GL00105] T2 
ON [T1]. [ACTINDX]= [T2]. [ACTINDX] 
WHERE YEAR1 = 2012 
AND PERIODID in ('2') 
AND ACTNUMST in ('4200-0000-C', '6940-0000-C', '6945-0000-C', '6950-0000-C')) 

, Table2 as (SELECT 
    'ASN' as [Site], 
    SUM(pi.amount) as [Elligence] 
FROM [dsi_ASN_dsicx].dbo.charge c 
    LEFT JOIN [dsi_ASN_dsicx].dbo.paymentitem pi on c.idcharge = pi.chargeid 
    LEFT JOIN [dsi_ASN_dsicx].dbo.payment p on pi.paymentid = p.idpayment 
    LEFT JOIN [dsi_ASN_dsicx].dbo.paymenttype pt on p.paymenttypeid = pt.idpaymenttype 
WHERE pi.amount != 0 
AND pt.paymentmethod not in ('5','7') 
AND pt.paymentmethod is not null 
AND p.sdate >='20120201' and p.sdate <= '20120229') 

SELECT * FROM Table1 
LEFT JOIN Table2 ON Table1.site = Table2.site 

希望這會有所幫助!標記爲答案,如果它=)

+1

+1用於回答一個非常不同的問題。我想也許它應該是一個完全的聯合,我不知道是否有人可能缺席。你不需要最後的連接中的ON子句(ON Table1.site = Table2.site)? – 2012-03-13 02:56:20

+0

謝謝@LevinMagruder。我將編輯以包含ON子句。 – ImGreg 2012-03-13 03:30:05

+1

這個解決方案完美無瑕!語法對於MS SSMS來說是完美的。非常感謝幫助。 – MSS 2012-03-13 18:40:34