两个CTE和一个UNION ALL用于比较数据集会导致意外结果

时间:2018-05-25 13:49:48

标签: sum common-table-expression partition union-all cross-apply

编写了两个CTE来返回不同select语句的结果集。 UNION所有结果集都以每次执行时更改的两个cte之间的差异数结束。

我已经注释掉了脚本的一些行,看起来这个问题与UNION所有列'Premium','Taxes','TimeSpanID'的结果集有关。是否有不同的方法可用于比较下面脚本的结果:

WITH
CTE1 AS (
select [TransactionDateID]
  ,[TransactionTypeID]
  ,[TransactionID]
  ,[BillingAccountID]
  ,[BillingInvoiceID]
  ,[BillingPaymentID]
  ,[Premium]
  ,[Taxes]
  ,[TimeSpanID]
  from Fact.SalesBalance1
) ,
CTE2 AS(
SELECT TransactionDateID=MAX(TransactionDateID) OVER (PARTITION BY 
[BillingAccountID] ORDER BY [StartDate]),
TransactionTypeID,
TransactionID,
BillingAccountID,
BillingInvoiceID,
BillingPaymentID,
Premium=SUM(Premium) OVER (PARTITION BY [BillingAccountID] ORDER BY 
StartDate),
Taxes=SUM(Taxes) OVER (PARTITION BY [BillingAccountID] ORDER BY StartDate),
TimeSpanID
FROM 
(
    SELECT *,

    StartDate=[DateKey],

    EndDate=ISNULL(MAX([DateKey]) OVER (PARTITION BY [BillingAccountID] 
ORDER BY DateKey ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING),
CAST('12/31/9999' AS DATE))
    FROM Fact.SalesTransaction P
    INNER JOIN Dim.SalesTransDate Q ON P.TransactionDateID = 
Q.CalendarDateID
) T
CROSS APPLY (
    SELECT TimeSpanID FROM Dim.TimeSpan WHERE StartDate = T.StartDate AND 
EndDate = T.EndDate
)TS  

)

SELECT MIN(TableName) as TableName
, TransactionDateID
,TransactionTypeID
,TransactionID
,BillingAccountID
,BillingInvoiceID
,BillingPaymentID
,Premium
,Taxes
,TimeSpanID
FROM
(
SELECT 'Fact CTE1' as TableName
, A.TransactionDateID
,A.TransactionTypeID
,A.TransactionID
,A.BillingAccountID
,A.BillingInvoiceID
,A.BillingPaymentID
,A.Premium
,A.Taxes
,A.TimeSpanID
FROM CTE1 A
UNION ALL
SELECT 'Fact CTE2’ as TableName, B.TransactionDateID
,B.TransactionTypeID
,B.TransactionID
,B.BillingAccountID
,B.BillingInvoiceID
,B.BillingPaymentID
,B.Premium
,B.Taxes
,B.TimeSpanID
FROM CTE2 B
) tmp

GROUP BY TransactionDateID
,TransactionTypeID
,TransactionID
,BillingAccountID
,BillingInvoiceID
,BillingPaymentID
,Premium
,Taxes
,TimeSpanID
HAVING COUNT(0) = 1
ORDER BY TransactionDateID
,TransactionTypeID
,TransactionID
,BillingAccountID
,BillingInvoiceID
,BillingPaymentID
,TimeSpanID

1 个答案:

答案 0 :(得分:0)

似乎UNION ALL在我的问题中表现不佳。我根据下面更新的脚本将'UNION ALL'更改为'INTERSECT'并且工作正常:

WITH
CTE1 AS (
select [TransactionDateID]
  ,[TransactionTypeID]
  ,[TransactionID]
  ,[BillingAccountID]
  ,[BillingInvoiceID]
  ,[BillingPaymentID]
  ,[Premium]
  ,[Taxes]
  ,[TimeSpanID]
  from Fact.SalesBalance1
) ,
CTE2 AS(
SELECT TransactionDateID=MAX(TransactionDateID) OVER (PARTITION BY 
[BillingAccountID] ORDER BY [StartDate]),
TransactionTypeID,
TransactionID,
BillingAccountID,
BillingInvoiceID,
BillingPaymentID,
Premium=SUM(Premium) OVER (PARTITION BY [BillingAccountID] ORDER BY 
StartDate),
Taxes=SUM(Taxes) OVER (PARTITION BY [BillingAccountID] ORDER BY StartDate),
TimeSpanID
FROM 

(
    SELECT *,

    StartDate=[DateKey],

    EndDate=ISNULL(MAX([DateKey]) OVER (PARTITION BY [BillingAccountID] 
ORDER BY DateKey ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING),
CAST('12/31/9999' AS DATE))
    FROM Fact.SalesTransaction P
    INNER JOIN Dim.SalesTransDate Q ON P.TransactionDateID = 
Q.CalendarDateID
) T
CROSS APPLY (
    SELECT TimeSpanID FROM Dim.TimeSpan WHERE StartDate = T.StartDate AND 
EndDate = T.EndDate
)TS  

)

SELECT MIN(TableName) as TableName
, TransactionDateID
,TransactionTypeID
,TransactionID
,BillingAccountID
,BillingInvoiceID
,BillingPaymentID
,Premium
,Taxes
,TimeSpanID
FROM

(
SELECT 'Fact CTE1' as TableName
, A.TransactionDateID
,A.TransactionTypeID
,A.TransactionID
,A.BillingAccountID
,A.BillingInvoiceID
,A.BillingPaymentID
,A.Premium
,A.Taxes
,A.TimeSpanID
FROM CTE1 A
INTERSECT
--UNION ALL
SELECT 'Fact CTE2’ as TableName, B.TransactionDateID
,B.TransactionTypeID
,B.TransactionID
,B.BillingAccountID
,B.BillingInvoiceID
,B.BillingPaymentID
,B.Premium
,B.Taxes
,B.TimeSpanID

来自CTE2 B. )tmp

GROUP BY TransactionDateID     ,TransactionTypeID     ,的TransactionID     ,BillingAccountID     ,BillingInvoiceID     ,BillingPaymentID     ,溢价     ,税收     ,TimeSpanID     HUNT COUNT(0)= 1     ORDER BY TransactionDateID     ,TransactionTypeID     ,的TransactionID     ,BillingAccountID     ,BillingInvoiceID     ,BillingPaymentID     ,TimeSpanID

相关问题