2015-09-04 63 views
0

我有六種不同的select語句用於SSRS報告目的。聯合所有幫助需要

以下是兩條陳述。我需要關於如何對波紋管執行Union All的幫助,並將所有語句合併爲一個。

DECLARE @FromDate AS DATE='04-Aug-2015' 
DECLARE @ToDate AS DATE='05-Aug-2015' 

SELECT 
    A.LBrCode AS BranchCode, 
    (SELECT B.Name 
    FROM D001003 B 
    WHERE A.LBrCode = B.PBrCode) AS BranchName, 
    C.PrdCd AS Product, 
    SUM(D.FcyTrnAmt) AS Amount 
FROM 
    D009022 A 
INNER JOIN 
    D009021 C ON substring(A.PrdAcctId, 1, 8) = C.PrdCd 
       AND A.LBrCode = C.LBrCode 
LEFT JOIN 
    D009040 D ON A.PrdAcctId = D.VcrAcctId 
       AND substring(D.VcrAcctId, 1, 8) = C.PrdCd 
       AND A.LBrCode = D.LBrCode 
WHERE 
    A.AcctStat <> 3 
    AND A.DateOpen >= @FromDate 
    AND A.DateOpen <= @ToDate 
    AND C.ModuleType = 11 
    AND D.DrCr = 'D' 
    AND D.CanceledFlag <> 'C' 
GROUP BY 
    A.LBrCode, C.PrdCd 
ORDER BY 
    A.LBrCode 

UNION ALL 

SELECT 
    A.LBrCode AS BranchCode, 
    (SELECT B.Name FROM D001003 B WHERE A.LBrCode = B.PBrCode) AS BranchName, 
    C.PrdCd AS Product, 
    SUM(A.ActTotBalFcy) AS Balance 
FROM 
    D009022 A 
INNER JOIN 
    D009021 C ON substring(A.PrdAcctId, 1, 8) = C.PrdCd 
       AND A.LBrCode = C.LBrCode 
WHERE 
    C.ModuleType = 11 
    AND A.AcctStat <> 3 
    AND A.DateOpen >= @FromDate 
    AND A.DateOpen <= @ToDate 
GROUP BY 
    A.LBrCode, C.PrdCd 
ORDER BY 
    A.LBrCode 
+0

可以使用CTE(公用表表達式) –

+0

將D的條件從WHERE子句移到ON子句以獲得真正的LEFT JOIN行爲。 (因爲它現在它作爲一個普通的內部連接執行......) – jarlh

回答

1

你只能申請一個ORDER BY子句影響結果的順序,它有適用於整個結果集。如果像我懷疑,你希望所有從上面查詢的結果的從底部查詢結果之前出現,則需要另一列添加到數據允許這樣的事情發生:

SELECT A.LBrCode AS BranchCode, 
(SELECT B.Name FROM D001003 B WHERE A.LBrCode=B.PBrCode) AS BranchName, 
C.PrdCd AS Product, 
sum(D.FcyTrnAmt) AS Amount, 
1 as ResultSet 
FROM D009022 A INNER JOIN D009021 C 
ON substring(A.PrdAcctId,1,8)=C.PrdCd 
AND A.LBrCode=C.LBrCode 
LEFT JOIN D009040 D 
ON A.PrdAcctId=D.VcrAcctId 
AND substring(D.VcrAcctId,1,8)=C.PrdCd 
AND A.LBrCode=D.LBrCode 
WHERE A.AcctStat <> 3 AND A.DateOpen>[email protected] AND A.DateOpen<[email protected] 
AND C.ModuleType=11 
AND D.DrCr='D' 
AND D.CanceledFlag<>'C' 

GROUP BY A.LBrCode, C.PrdCd 
--ORDER BY A.LBrCode 

UNION ALL 

SELECT A.LBrCode AS BranchCode, 
(SELECT B.Name FROM D001003 B WHERE A.LBrCode=B.PBrCode) AS BranchName, 
C.PrdCd AS Product, 
sum(A.ActTotBalFcy) AS Balance, 
2 
FROM D009022 A INNER JOIN D009021 C 
ON substring(A.PrdAcctId,1,8)=C.PrdCd 
AND A.LBrCode=C.LBrCode 
WHERE C.ModuleType=11 
AND A.AcctStat <> 3 
AND A.DateOpen>[email protected] AND A.DateOpen<[email protected] 

GROUP BY A.LBrCode, C.PrdCd 
ORDER BY ResultSet,BranchCode 
0

嘗試這樣的事情

declare @var1 = value1; 
declare @var2 = value2 
;with cte1 AS(
Select statement1 
UNION ALL 
Select statement2 
UNION ALL 
Select statement3 
UNION ALL 
Select statement4 
UNION ALL 
Select statement5 
UNION ALL 
Select statement6 
) 
Select * From CTE1 
+0

但是如何使用group? –

1

對於工會要運行這兩個查詢必須具有相同數量的列並且是兼容的數據類型,您可能需要轉換列數據類型以確保它們相同。例如,您可能遇到與您的金額和餘額數據類型列不兼容的問題。

您不能在聯合中對每個單獨的語句進行排序,這是沒有意義的,因爲您將生成單個輸出。

但是,考慮到這些要點,您的查詢應該像現在這樣工作。

declare @test table (a int, b varchar(10)) 

insert into @test values (10,'test1') 
insert into @test values (20,'test2') 

select 
a, b 
from 
@test 

UNION ALL 

select 
a, b 
from 
@test 

order by a 
1

查看您的查詢,我假設您的sum計算是所有查詢之間的唯一區別。

例如,上述兩個union all查詢之間的唯一區別是用於summation的字段和where子句過濾器(D.DrCr='D' AND D.CanceledFlag<>'C')。如果這是真的,那麼你可以只使用CASE WHEN語句來處理所有的6個不同的場景是這樣的:

DECLARE @FromDate AS DATE = '04-Aug-2015'; 
DECLARE @ToDate AS DATE = '05-Aug-2015'; 

SELECT A.LBrCode AS BranchCode 
    ,(
     SELECT B.NAME 
     FROM D001003 B 
     WHERE A.LBrCode = B.PBrCode 
     ) AS BranchName 
    ,C.PrdCd AS Product 
    ,CASE 
     WHEN D.DrCr = 'D' AND D.CanceledFlag <> 'C' 
      THEN sum(A.ActTotBalFcy) 
     /*add other remaining conditions here */ 
    ELSE sum(D.FcyTrnAmt) 
     END AS Amount 
FROM D009022 A 
INNER JOIN D009021 C ON substring(A.PrdAcctId, 1, 8) = C.PrdCd 
    AND A.LBrCode = C.LBrCode 
LEFT JOIN D009040 D ON A.PrdAcctId = D.VcrAcctId 
    AND substring(D.VcrAcctId, 1, 8) = C.PrdCd 
    AND A.LBrCode = D.LBrCode 
WHERE A.AcctStat <> 3 
    AND A.DateOpen >= @FromDate 
    AND A.DateOpen <= @ToDate 
    AND C.ModuleType = 11 
GROUP BY A.LBrCode 
    ,C.PrdCd 
ORDER BY A.LBrCode 
0

我將創建2 CTE當時:

SELECT * 
FROM CTE1 

UNION ALL 

SELECT * 
FROM CTE2 
GROUP BY ____ 
ORDER BY ______ 

你不能有更多然後1 GROUP BY和ORDER BY在執行聯合全部時