【发布时间】:2021-01-15 15:24:19
【问题描述】:
我正在编写 SQL 来报告类似于以下格式的数据。以“P”开头的行是特定供应商的汇总行,其下方与付款或该供应商相关联的相应汇款“R”行。例如,P 行上的 PAID_AMT 量是“NW Forest Supplies”的总和值(1000.50 = 对应的 R 行 110 + 800 + 100.50 = 1000.50)。我开始以 UNION 查询的形式执行此操作,但挑战在于“P”行表示的字段与“R”行表示的字段不同,因此我正在努力将数据组合在一起。
以“C”开头的最后一行是所有行的总体摘要,我也在努力并且不正确。根据示例,它应该将“P”行中的总 PAID_AMT 值相加,即 2056.00 (1000.50 + 55 + 1000.50),然后输出支付次数的总计数 (3),最后输出总计数汇款 - 在本例中为 7。
也许在最终结果中使用CTE和union更好,或者使用临时表将'P'和'R'数据的数据插入到自己的表中,然后查询?
SELECT
'P'
, 'CRD'
, 'PayerName.Payables'
, A.ADDRESS4
, A.PYMNT_ID_REF
, SUM(B.PAID_AMT)
, A.REMIT_VENDOR
, CAST(B.REMIT_ADDR_SEQ_NUM AS VARCHAR)
, A.NAME1
, 'USD'
FROM
PS_PAYMENT_TBL A
INNER JOIN PS_PYMNT_VCHR_XREF B
ON B.PYMNT_ID = A.PYMNT_ID
AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
WHERE A.PYMNT_DT > '01/12/2021'
GROUP BY
A.REMIT_VENDOR
, A.ADDRESS4
, A.PYMNT_ID_REF
, A.REMIT_VENDOR
, CAST(B.REMIT_ADDR_SEQ_NUM AS VARCHAR)
, A.NAME1
UNION
SELECT
'R'
, A.PYMNT_ID_REF
, C.INVOICE_ID
, C.INVOICE_DT
, C.GROSS_AMT
, C.DSCNT_AMT
, B.VOUCHER_ID
, C.PO_ID
, ''
, ''
FROM
PS_PYMNT_VCHR_XREF B
INNER JOIN PS_PAYMENT_TBL A
ON B.PYMNT_ID = A.PYMNT_ID
AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
INNER JOIN PS_VOUCHER C
ON B.VOUCHER_ID = C.VOUCHER_ID
AND C.BUSINESS_UNIT = B.BUSINESS_UNIT
WHERE A.PYMNT_DT > '01/12/2021'
UNION
SELECT
'C'
, SUM(A.PAID_AMT)
, COUNT(A.PAID_AMT) , COUNT(??)
FROM
PS_PYMNT_VCHR_XREF A
INNER JOIN PS_PAYMENT_TBL B
ON B.PYMNT_ID = A.PYMNT_ID
AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
WHERE A.PYMNT_DT > '01/12/2021'
GROUP BY B.NAME1
ORDER BY 7, 1
21 年 1 月 17 日编辑:
我稍微修改了 SQL,并且相信我的代码的各个部分都可以正常工作,但我正在苦苦思考如何将这些部分以与示例所示相同的方式组合在一起,并在每个付款下方显示汇款。
UNION 是我能想到的唯一一个垂直组合数据的函数,但我需要能够将汇款分组到每个相应的付款行下方,我不知道有什么方法可以做到这一点。另外值得一提的是,Payment 和 Remittances 查询的列是不同的(列数和类型)并且并不总是相互关联。
--Payment:
SELECT B.ADDRESS4, B.PYMNT_ID_REF, SUM(A.PAID_AMT), B.REMIT_VENDOR, A.REMIT_ADDR_SEQ_NUM,
B.NAME1
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_PAYMENT_TBL B ON B.PYMNT_ID = A.PYMNT_ID AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
WHERE B.PYMNT_DT > '2021-01-03'
--AND A.PYMNT_ID = '0000263556'
GROUP BY B.ADDRESS4, B.PYMNT_ID_REF, B.REMIT_VENDOR, A.REMIT_ADDR_SEQ_NUM,
B.NAME1
--Remittances:
SELECT 2, A.PYMNT_ID_REF, C.INVOICE_ID, C.INVOICE_DT, C.GROSS_AMT, C.DSCNT_AMT, B.VOUCHER_ID,
C.PO_ID
FROM PS_PYMNT_VCHR_XREF B
INNER JOIN PS_PAYMENT_TBL A ON B.PYMNT_ID = A.PYMNT_ID AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
INNER JOIN PS_VOUCHER C ON B.VOUCHER_ID = C.VOUCHER_ID AND C.BUSINESS_UNIT = B.BUSINESS_UNIT
WHERE A.PYMNT_DT > '2021-01-03'
--AND A.PYMNT_ID = '0000263556'
--Control data:
WITH CONTROLTOTALS AS (
SELECT SUM(A.PAID_AMT) AS TOT_PAID_AMT
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_PAYMENT_TBL B ON B.PYMNT_ID = A.PYMNT_ID AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
WHERE B.PYMNT_DT > '2021-01-03' )
, CONTROLCOUNT1 AS (
SELECT COUNT(PYMNT_ID_REF) AS PYMNT_COUNT
FROM PS_PAYMENT_TBL B
WHERE B.PYMNT_DT > '2021-01-03'
AND PYMNT_ID <> '' ) ,
CONTROLCOUNT2 AS (
SELECT COUNT(*) AS REMIT_COUNT
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_PAYMENT_TBL B ON B.PYMNT_ID = A.PYMNT_ID AND A.BANK_SETID = B.BANK_SETID
AND A.BANK_CD = B.BANK_CD
AND A.BANK_ACCT_KEY = B.BANK_ACCT_KEY
WHERE PYMNT_DT > '2021-01-03' )
SELECT 'C', A.TOT_PAID_AMT, B.PYMNT_COUNT, C.REMIT_COUNT
FROM CONTROLTOTALS A, CONTROLCOUNT1 B, CONTROLCOUNT2 C
21 年 1 月 18 日编辑:
以下是这些查询中使用的 3 个表的表结构:
以下是一些示例数据(两个供应商的 2 个付款行(Radiometer America - 付款 ID 023946 和 Highmark Inc. - 付款 ID 023943),以及与每个供应商关联的相应汇款行:
以下是与供应商的每笔付款相关的示例汇款数据(Highmark 以红色突出显示,有 2 笔汇款,Radiometer America 以绿色突出显示,有 6 笔汇款,示例输出总共有 8 笔):
这是底部的最终控制(大)总计行。 TOT_PAID_AMT 表示每个供应商的上述总付款 (8901.94 + 997,343.44)、总付款计数 (2) 和报告中的总汇款(2 来自 Highmark,6 来自 Radiometer America:
所以现在我需要将所有这些放在一起,并以与原始示例相同的方式输出,汇款显示在每个供应商付款的下方。
所以我有所有单独的部分,但我现在需要以这种格式将它们联系在一起,为此我正在努力。希望这能提供更多的清晰度。
此处的表结构/示例文件:
【问题讨论】:
标签: sql sql-server sql-server-2014 union-all