联合所有帮助需要
我有六种不同的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
你只能申请一个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
尝试这样的事情
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
但是如何使用group? –
对于工会要运行这两个查询必须具有相同数量的列并且是兼容的数据类型,您可能需要转换列数据类型以确保它们相同。例如,您可能遇到与您的金额和余额数据类型列不兼容的问题。
您不能在联合中对每个单独的语句进行排序,这是没有意义的,因为您将生成单个输出。
但是,考虑到这些要点,您的查询应该像现在这样工作。
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
查看您的查询,我假设您的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
我将创建2 CTE当时:
SELECT *
FROM CTE1
UNION ALL
SELECT *
FROM CTE2
GROUP BY ____
ORDER BY ______
你不能有更多然后1 GROUP BY和ORDER BY在执行联合全部时
可以使用CTE(公用表表达式) –
将D的条件从WHERE子句移到ON子句以获得真正的LEFT JOIN行为。 (因为它现在它作为一个普通的内部连接执行......) – jarlh