具有特定于该行的硬编码值的非透视行的输出列
Output column on unpivoted row(s) with hardcoded value specific to that row
我有以下查询,它使用 unpivot
将 FREIGHT_AMT
and/or SALETX_AMT
中的值输出到 MERCHANDISE_AMT
列中,以便我可以输出这些作为单独的发票行。
对于我输出的任何未旋转的行(FREIGHT_AMT
、SALETAX_AMT
),我需要做的是输出字符串 'FREIGHT'(对于 FREIGHT_AMT
行)和 [= Line_Type
.
列中的 58=](对于 SALETX_AMT
)行
通常我会考虑在原始查询的 CASE
语句中执行此操作,但是因为此时这些仍然是列而不是行,所以我不确定如何正确指示这一点。
WITH CTE AS (
SELECT CONCAT(A.BUSINESS_UNIT,A.VOUCHER_ID) AS INVOICE_ID, A.VOUCHER_LINE_NUM,
CASE WHEN EXISTS (SELECT 1 FROM PS_DISTRIB_LINE
WHERE BUSINESS_UNIT = A.BUSINESS_UNIT
AND VOUCHER_ID = A.VOUCHER_ID
AND VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM)
THEN 'ITEM' ELSE 'MISCELLANEOUS' END AS LineType, A.MERCHANDISE_AMT, C.FREIGHT_AMT
, C.SALETX_AMT
FROM PS_VOUCHER_LINE A
LEFT OUTER JOIN PS_DISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN PS_VOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN PS_PYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE
C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT INVOICE_ID, VOUCHER_LINE_NUM - 1 + row_number() over
(PARTITION BY INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) AS VOUCHER_LINE_NUM,LineType ,Value
FROM CTE
unpivot (Value FOR col IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT)) u
WHERE Value <> 0.00
非透视查询的期望输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 17480.820
1100000720667 2 FREIGHT 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 FREIGHT 55.500
1100000721196 7 TAX 512.890
编辑:这包括我当前数据的示例数据:
--CREATE TABLES:
CREATE TABLE #TempVOUCHER_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4), MERCHANDISE_AMT decimal (7,3))
CREATE TABLE #TempDISTRIB_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4))
CREATE TABLE #TempVOUCHER (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), FREIGHT_AMT decimal (7,3), SALETX_AMT decimal (7,3), INVOICE_DT datetime, ACCOUNTING_DT datetime, CLOSE_STATUS varchar(4) )
CREATE TABLE #TempPYMNT_VCHR_XREF (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), PYMNT_ID varchar (10))
--INSERT DATA INTO TEMP TABLES:
INSERT INTO #TempVOUCHER_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM, MERCHANDISE_AMT)
VALUES ('11000', '00720667', '1', 1748.820),
('11000', '00721196', '5', 4680.200)
INSERT INTO #TempDISTRIB_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM)
VALUES ('11000', '00720667', '1'),
('11000', '00721196', '5')
INSERT INTO #TempVOUCHER
(BUSINESS_UNIT, VOUCHER_ID, FREIGHT_AMT, SALETX_AMT, INVOICE_DT, ACCOUNTING_DT, CLOSE_STATUS)
VALUES ('11000', '00720667', 59.50, 0.00, '2019-05-03', '2014-05-14', 'A'),
('11000', '00721196', 55.50, 512.890, '2020-08-10', '2020-08-12', 'A')
INSERT INTO #TempPYMNT_VCHR_XREF
(BUSINESS_UNIT, VOUCHER_ID, PYMNT_ID)
VALUES ('11000', '00720667', ''),
('11000', '00721196', '')
--QUERY FROM TEMP TABLES:
;
WITH CTE AS (
SELECT CONCAT(A.BUSINESS_UNIT,A.VOUCHER_ID) AS INVOICE_ID, A.VOUCHER_LINE_NUM,
CASE WHEN EXISTS (SELECT 1 FROM #TempDISTRIB_LINE
WHERE BUSINESS_UNIT = A.BUSINESS_UNIT
AND VOUCHER_ID = A.VOUCHER_ID
AND VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM)
THEN 'ITEM' ELSE 'MISCELLANEOUS' END AS LineType, A.MERCHANDISE_AMT, C.FREIGHT_AMT
, C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE
C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT INVOICE_ID, VOUCHER_LINE_NUM - 1 + row_number() over (PARTITION BY INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) AS VOUCHER_LINE_NUM, LineType --CASE WHEN FREIGHT_AMT <> 0.00 THEN 'FREIGHT' WHEN SALETX_AMT <> 0.00 THEN 'TAX' ELSE 'ITEM' END AS LineType
,Value
FROM CTE
unpivot (Value FOR col IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT)) u
WHERE Value <> 0.00
当前输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 1748.820
1100000720667 2 ITEM 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 ITEM 55.500
1100000721196 7 ITEM 512.890
期望输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 1748.820
1100000720667 2 FREIGHT 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 FREIGHT 55.500
1100000721196 7 TAX 512.890
重复错误(根据 Larnu 的回答:)
编辑 2:
CREATE TABLE #TempVOUCHER_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4), MERCHANDISE_AMT decimal (8,3))
--DROP TABLE #TempDISTRIB_LINE
CREATE TABLE #TempDISTRIB_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4))
--DROP TABLE #TempVOUCHER
CREATE TABLE #TempVOUCHER (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), FREIGHT_AMT decimal (7,3), SALETX_AMT decimal (7,3), INVOICE_DT datetime, ACCOUNTING_DT datetime, CLOSE_STATUS varchar(4) )
--DROP TABLE #TempPYMNT_VCHR_XREF
CREATE TABLE #TempPYMNT_VCHR_XREF (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), PYMNT_ID varchar (10))
--DROP TABLE #TempVOUCHER_LINE
INSERT INTO #TempVOUCHER_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM, MERCHANDISE_AMT)
VALUES ('11000', '00720667', '1', 17480.820),
('11000', '00721196', '5', 4680.200),
('11000', '00721021', '1', 82.64),
('11000', '00721021', '2', 542.12),
('11000', '00721021', '3', 126.89),
('11000', '00721021', '4', 1022.03)
--DROP TABLE #TempDISTRIB_LINE
INSERT INTO #TempDISTRIB_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM)
VALUES ('11000', '00720667', '1'),
('11000', '00721196', '5'),
('11000', '00721021', '1'),
('11000', '00721021', '2'),
('11000', '00721021', '3'),
('11000', '00721021', '4')
--SELECT * FROM #TempVOUCHER
--DROP TABLE #TempVOUCHER
INSERT INTO #TempVOUCHER
(BUSINESS_UNIT, VOUCHER_ID, FREIGHT_AMT, SALETX_AMT, INVOICE_DT, ACCOUNTING_DT, CLOSE_STATUS)
VALUES ('11000', '00720667', 59.50, 0.00, '05-03-2019', '05-14-2014', 'A'),
('11000', '00721196', 55.50, 512.890, '08-10-2020', '08-12-2020', 'A'),
('11000', '00721021', 129.01, 0.00, '12-13-2019', '12-16-2019', 'A')
--DROP TABLE #TempPYMNT_VCHR_XREF
INSERT INTO #TempPYMNT_VCHR_XREF
(BUSINESS_UNIT, VOUCHER_ID, PYMNT_ID)
VALUES ('11000', '00720667', ''),
('11000', '00721196', ''),
('11000', '00721021', '')
;
--SQL QUERY:
WITH CTE AS
(SELECT CONCAT(A.BUSINESS_UNIT, A.VOUCHER_ID) AS INVOICE_ID,
A.VOUCHER_LINE_NUM,
A.MERCHANDISE_AMT,
C.FREIGHT_AMT,
C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT
AND B.VOUCHER_ID = A.VOUCHER_ID
AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT
AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT
AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT C.INVOICE_ID,
C.VOUCHER_LINE_NUM + ROW_NUMBER() OVER (PARTITION BY C.INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) - 1 AS VOUCHER_LINE_NUM,
V.LineType,
V.[Value]
FROM CTE C
CROSS APPLY (VALUES('Merchandise',C.MERCHANDISE_AMT),
('Freight',C.FREIGHT_AMT),
('Tax',C.SALETX_AMT))V(LineType, Value)
WHERE V.[Value] <> 0;
我认为这就是您想要的。我宁愿不使用限制性 UNPIVOT
运算符,而是使用 VALUES
table 结构。请注意,您需要将 {Some Expression}
替换为定义行编号顺序的表达式:
WITH CTE AS
(SELECT CONCAT(A.BUSINESS_UNIT, A.VOUCHER_ID) AS INVOICE_ID,
A.VOUCHER_LINE_NUM,
A.MERCHANDISE_AMT,
C.FREIGHT_AMT,
C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT
AND B.VOUCHER_ID = A.VOUCHER_ID
AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT
AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT
AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT C.INVOICE_ID,
C.VOUCHER_LINE_NUM + ROW_NUMBER() OVER (PARTITION BY C.INVOICE_ID ORDER BY {Some Expression}) - 1 AS VOUCHER_LINE_NUM,
V.LineType,
V.[Value]
FROM CTE C
CROSS APPLY (VALUES('Merchandise',C.MERCHANDISE_AMT),
('Freight',C.FREIGHT_AMT),
('Tax',C.SALETX_AMT))V(LineType, Value)
WHERE V.[Value] <> 0;
我有以下查询,它使用 unpivot
将 FREIGHT_AMT
and/or SALETX_AMT
中的值输出到 MERCHANDISE_AMT
列中,以便我可以输出这些作为单独的发票行。
对于我输出的任何未旋转的行(FREIGHT_AMT
、SALETAX_AMT
),我需要做的是输出字符串 'FREIGHT'(对于 FREIGHT_AMT
行)和 [= Line_Type
.
SALETX_AMT
)行
通常我会考虑在原始查询的 CASE
语句中执行此操作,但是因为此时这些仍然是列而不是行,所以我不确定如何正确指示这一点。
WITH CTE AS (
SELECT CONCAT(A.BUSINESS_UNIT,A.VOUCHER_ID) AS INVOICE_ID, A.VOUCHER_LINE_NUM,
CASE WHEN EXISTS (SELECT 1 FROM PS_DISTRIB_LINE
WHERE BUSINESS_UNIT = A.BUSINESS_UNIT
AND VOUCHER_ID = A.VOUCHER_ID
AND VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM)
THEN 'ITEM' ELSE 'MISCELLANEOUS' END AS LineType, A.MERCHANDISE_AMT, C.FREIGHT_AMT
, C.SALETX_AMT
FROM PS_VOUCHER_LINE A
LEFT OUTER JOIN PS_DISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN PS_VOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN PS_PYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE
C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT INVOICE_ID, VOUCHER_LINE_NUM - 1 + row_number() over
(PARTITION BY INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) AS VOUCHER_LINE_NUM,LineType ,Value
FROM CTE
unpivot (Value FOR col IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT)) u
WHERE Value <> 0.00
非透视查询的期望输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 17480.820
1100000720667 2 FREIGHT 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 FREIGHT 55.500
1100000721196 7 TAX 512.890
编辑:这包括我当前数据的示例数据:
--CREATE TABLES:
CREATE TABLE #TempVOUCHER_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4), MERCHANDISE_AMT decimal (7,3))
CREATE TABLE #TempDISTRIB_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4))
CREATE TABLE #TempVOUCHER (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), FREIGHT_AMT decimal (7,3), SALETX_AMT decimal (7,3), INVOICE_DT datetime, ACCOUNTING_DT datetime, CLOSE_STATUS varchar(4) )
CREATE TABLE #TempPYMNT_VCHR_XREF (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), PYMNT_ID varchar (10))
--INSERT DATA INTO TEMP TABLES:
INSERT INTO #TempVOUCHER_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM, MERCHANDISE_AMT)
VALUES ('11000', '00720667', '1', 1748.820),
('11000', '00721196', '5', 4680.200)
INSERT INTO #TempDISTRIB_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM)
VALUES ('11000', '00720667', '1'),
('11000', '00721196', '5')
INSERT INTO #TempVOUCHER
(BUSINESS_UNIT, VOUCHER_ID, FREIGHT_AMT, SALETX_AMT, INVOICE_DT, ACCOUNTING_DT, CLOSE_STATUS)
VALUES ('11000', '00720667', 59.50, 0.00, '2019-05-03', '2014-05-14', 'A'),
('11000', '00721196', 55.50, 512.890, '2020-08-10', '2020-08-12', 'A')
INSERT INTO #TempPYMNT_VCHR_XREF
(BUSINESS_UNIT, VOUCHER_ID, PYMNT_ID)
VALUES ('11000', '00720667', ''),
('11000', '00721196', '')
--QUERY FROM TEMP TABLES:
;
WITH CTE AS (
SELECT CONCAT(A.BUSINESS_UNIT,A.VOUCHER_ID) AS INVOICE_ID, A.VOUCHER_LINE_NUM,
CASE WHEN EXISTS (SELECT 1 FROM #TempDISTRIB_LINE
WHERE BUSINESS_UNIT = A.BUSINESS_UNIT
AND VOUCHER_ID = A.VOUCHER_ID
AND VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM)
THEN 'ITEM' ELSE 'MISCELLANEOUS' END AS LineType, A.MERCHANDISE_AMT, C.FREIGHT_AMT
, C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE
C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT INVOICE_ID, VOUCHER_LINE_NUM - 1 + row_number() over (PARTITION BY INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) AS VOUCHER_LINE_NUM, LineType --CASE WHEN FREIGHT_AMT <> 0.00 THEN 'FREIGHT' WHEN SALETX_AMT <> 0.00 THEN 'TAX' ELSE 'ITEM' END AS LineType
,Value
FROM CTE
unpivot (Value FOR col IN (MERCHANDISE_AMT, FREIGHT_AMT, SALETX_AMT)) u
WHERE Value <> 0.00
当前输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 1748.820
1100000720667 2 ITEM 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 ITEM 55.500
1100000721196 7 ITEM 512.890
期望输出:
INVOICE_ID VOUCHER_LINE_NUM LineType Value
1100000720667 1 ITEM 1748.820
1100000720667 2 FREIGHT 59.500
1100000721196 5 ITEM 4680.200
1100000721196 6 FREIGHT 55.500
1100000721196 7 TAX 512.890
重复错误(根据 Larnu 的回答:)
编辑 2:
CREATE TABLE #TempVOUCHER_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4), MERCHANDISE_AMT decimal (8,3))
--DROP TABLE #TempDISTRIB_LINE
CREATE TABLE #TempDISTRIB_LINE (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), VOUCHER_LINE_NUM varchar (4))
--DROP TABLE #TempVOUCHER
CREATE TABLE #TempVOUCHER (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), FREIGHT_AMT decimal (7,3), SALETX_AMT decimal (7,3), INVOICE_DT datetime, ACCOUNTING_DT datetime, CLOSE_STATUS varchar(4) )
--DROP TABLE #TempPYMNT_VCHR_XREF
CREATE TABLE #TempPYMNT_VCHR_XREF (BUSINESS_UNIT varchar(10), VOUCHER_ID varchar(16), PYMNT_ID varchar (10))
--DROP TABLE #TempVOUCHER_LINE
INSERT INTO #TempVOUCHER_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM, MERCHANDISE_AMT)
VALUES ('11000', '00720667', '1', 17480.820),
('11000', '00721196', '5', 4680.200),
('11000', '00721021', '1', 82.64),
('11000', '00721021', '2', 542.12),
('11000', '00721021', '3', 126.89),
('11000', '00721021', '4', 1022.03)
--DROP TABLE #TempDISTRIB_LINE
INSERT INTO #TempDISTRIB_LINE
(BUSINESS_UNIT, VOUCHER_ID, VOUCHER_LINE_NUM)
VALUES ('11000', '00720667', '1'),
('11000', '00721196', '5'),
('11000', '00721021', '1'),
('11000', '00721021', '2'),
('11000', '00721021', '3'),
('11000', '00721021', '4')
--SELECT * FROM #TempVOUCHER
--DROP TABLE #TempVOUCHER
INSERT INTO #TempVOUCHER
(BUSINESS_UNIT, VOUCHER_ID, FREIGHT_AMT, SALETX_AMT, INVOICE_DT, ACCOUNTING_DT, CLOSE_STATUS)
VALUES ('11000', '00720667', 59.50, 0.00, '05-03-2019', '05-14-2014', 'A'),
('11000', '00721196', 55.50, 512.890, '08-10-2020', '08-12-2020', 'A'),
('11000', '00721021', 129.01, 0.00, '12-13-2019', '12-16-2019', 'A')
--DROP TABLE #TempPYMNT_VCHR_XREF
INSERT INTO #TempPYMNT_VCHR_XREF
(BUSINESS_UNIT, VOUCHER_ID, PYMNT_ID)
VALUES ('11000', '00720667', ''),
('11000', '00721196', ''),
('11000', '00721021', '')
;
--SQL QUERY:
WITH CTE AS
(SELECT CONCAT(A.BUSINESS_UNIT, A.VOUCHER_ID) AS INVOICE_ID,
A.VOUCHER_LINE_NUM,
A.MERCHANDISE_AMT,
C.FREIGHT_AMT,
C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT
AND B.VOUCHER_ID = A.VOUCHER_ID
AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT
AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT
AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT C.INVOICE_ID,
C.VOUCHER_LINE_NUM + ROW_NUMBER() OVER (PARTITION BY C.INVOICE_ID, VOUCHER_LINE_NUM ORDER BY VOUCHER_LINE_NUM) - 1 AS VOUCHER_LINE_NUM,
V.LineType,
V.[Value]
FROM CTE C
CROSS APPLY (VALUES('Merchandise',C.MERCHANDISE_AMT),
('Freight',C.FREIGHT_AMT),
('Tax',C.SALETX_AMT))V(LineType, Value)
WHERE V.[Value] <> 0;
我认为这就是您想要的。我宁愿不使用限制性 UNPIVOT
运算符,而是使用 VALUES
table 结构。请注意,您需要将 {Some Expression}
替换为定义行编号顺序的表达式:
WITH CTE AS
(SELECT CONCAT(A.BUSINESS_UNIT, A.VOUCHER_ID) AS INVOICE_ID,
A.VOUCHER_LINE_NUM,
A.MERCHANDISE_AMT,
C.FREIGHT_AMT,
C.SALETX_AMT
FROM #TempVOUCHER_LINE A
LEFT OUTER JOIN #TempDISTRIB_LINE B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT
AND B.VOUCHER_ID = A.VOUCHER_ID
AND B.VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM
LEFT OUTER JOIN #TempVOUCHER C ON C.BUSINESS_UNIT = A.BUSINESS_UNIT
AND C.VOUCHER_ID = A.VOUCHER_ID
LEFT OUTER JOIN #TempPYMNT_VCHR_XREF I ON I.BUSINESS_UNIT = A.BUSINESS_UNIT
AND I.VOUCHER_ID = A.VOUCHER_ID
WHERE C.INVOICE_DT > '01-03-2019'
AND C.ACCOUNTING_DT < '06-01-2021'
AND I.PYMNT_ID = ''
AND C.CLOSE_STATUS <> 'C'
AND A.VOUCHER_ID IN ('00720667', '00721196', '00721021', '00721171', '00326705'))
SELECT C.INVOICE_ID,
C.VOUCHER_LINE_NUM + ROW_NUMBER() OVER (PARTITION BY C.INVOICE_ID ORDER BY {Some Expression}) - 1 AS VOUCHER_LINE_NUM,
V.LineType,
V.[Value]
FROM CTE C
CROSS APPLY (VALUES('Merchandise',C.MERCHANDISE_AMT),
('Freight',C.FREIGHT_AMT),
('Tax',C.SALETX_AMT))V(LineType, Value)
WHERE V.[Value] <> 0;