的Oracle查询是需要使用聚合函数来转换的Oracle SQL子查询到SQL Server(T-SQL)查询
SELECT A.BUSINESS_UNIT
, A.EXT_ORG_ID
, A.INVOICE_ID
, A.CONTACT_NAME
, SUM(A.LINE_AMT) AS INVOICE_AMT
, SUM(CASE WHEN A.APPLIED_AMT - Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD = A.ITEM_TYPE_CD
AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) < 0 THEN A.LINE_AMT
WHEN A.APPLIED_AMT - Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD = A.ITEM_TYPE_CD
AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) >= A.LINE_AMT THEN 0
ELSE A.LINE_AMT - A.APPLIED_AMT+Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD =
A.ITEM_TYPE_CD AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) END) AS INVOICE_BALANCE
, 0.0 FROM PS_SIS_SF_EO_INV_V A
GROUP BY A.BUSINESS_UNIT, A.EXT_ORG_ID, A.INVOICE_ID, A.CONTACT_NAME
转换的NVL到ISNULL给出了以下错误。 “不能对包含聚合或子查询的表达式执行聚合功能”。所以我在互联网上做了一些研究,发现CTE必须应用。
我转换为下面的查询,但仍查询的结果是不一样的Oracle查询。请帮忙。
WITH CTELINE AS (SELECT SUM(B.LINE_AMT) AS LINE_AMT, A.BUSINESS_UNIT FROM PS_ITEM_LINE_SF B, PS_SIS_SF_EO_INV_V A
WHERE B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.COMMON_ID = A.EXT_ORG_ID AND B.ITEM_NBR = A.ITEM_NBR AND B.ITEM_TYPE_CD = A.ITEM_TYPE_CD
AND B.LINE_AMT*100000 + B.LINE_SEQ_NBR > A.LINE_AMT * 100000 + A.LINE_SEQ_NBR GROUP BY A.BUSINESS_UNIT
),
CTECASE AS (SELECT CASE WHEN C.APPLIED_AMT - ISNULL((SELECT LINE_AMT FROM CTELINE ),0) < 0 THEN C.LINE_AMT
WHEN C.APPLIED_AMT - ISNULL((SELECT LINE_AMT FROM CTELINE),0) > = C.LINE_AMT THEN 0
ELSE C.LINE_AMT - C.APPLIED_AMT+ISNULL(( SELECT LINE_AMT FROM CTELINE),0) END AS CTE_INVOICE_BALANCE
,C.BUSINESS_UNIT,C.EXT_ORG_ID, C.INVOICE_ID FROM PS_SIS_SF_EO_INV_V C, CTELINE CTEL WHERE CTEL.BUSINESS_UNIT = C.BUSINESS_UNIT
GROUP BY C.BUSINESS_UNIT, C.EXT_ORG_ID, C.INVOICE_ID, C.CONTACT_NAME,C.APPLIED_AMT,C.LINE_AMT
)
SELECT A.BUSINESS_UNIT
, A.EXT_ORG_ID
, A.INVOICE_ID
, A.CONTACT_NAME
, SUM(A.LINE_AMT) AS INVOICE_AMT
, SUM(CTE_INVOICE_BALANCE) AS INVOICE_BALANCE
, 0.0
FROM PS_SIS_SF_EO_INV_V A, CTECASE CTEC WHERE CTEC.BUSINESS_UNIT = A.BUSINESS_UNIT AND A.EXT_ORG_ID = CTEC.EXT_ORG_ID AND
A.INVOICE_ID = CTEC.INVOICE_ID
GROUP BY A.BUSINESS_UNIT, A.EXT_ORG_ID, A.INVOICE_ID, A.CONTACT_NAME
在一个旁注:WITH子句可以让查询更易读,但在1992年之前加入一定不。你为什么不加入正确的ANSI连接? –