이 프로젝트의 데이터에는 세미콜론으로 구분 된 문자열이있는 두 개의 열이 있습니다. 이들은 실제로 순서쌍입니다. 예를 들어, "a; b; c", "x; y; z"에서 'a'는 'x'와 쌍을 이룹니다. 우리 쿼리의 목표는이 관계가 한 번에 한 행씩 명확하게 표현되는 테이블을 만드는 것입니다.SQL Server CTE가 제대로 가입하지 않음
DROP TABLE IF EXISTS dbo.sampleData;
DROP TABLE IF EXISTS dbo.lookupCPT;
GO
CREATE TABLE sampleData
(
numRow bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_numRow PRIMARY KEY,
sDelimQty varchar(MAX) NULL,
sDelimCPT varchar(MAX) NULL
)
CREATE TABLE lookupCPT
(
numRow bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_numRowCPT PRIMARY KEY,
sCPTCode varchar(10) NULL,
decCPTRate decimal(16,2) NULL
)
INSERT [dbo].[lookupCPT] ([numRow], [sCPTCode], [decCPTRate])
VALUES (1, N'123', CAST(4.00 AS Decimal(16, 2)))
INSERT [dbo].[lookupCPT] ([numRow], [sCPTCode], [decCPTRate])
VALUES (2, N'456', CAST(5.00 AS Decimal(16, 2)))
INSERT [dbo].[lookupCPT] ([numRow], [sCPTCode], [decCPTRate])
VALUES (3, N'789', CAST(7.00 AS Decimal(16, 2)))
INSERT [dbo].[sampleData] ([numRow], [sDelimQty], [sDelimCPT])
VALUES (1, N'1;2', N'123;789')
INSERT [dbo].[sampleData] ([numRow], [sDelimQty], [sDelimCPT])
VALUES (2, N'3', N'456')
우리는이 사용하는 공통 테이블 식을 달성하기 위해 시도 : 여기
샘플 데이터를 다시 생성하는 스크립트입니다 그러나WITH Qty_CTE (numRowQ, Qty) AS
(
SELECT numRow, value
FROM sampleData
CROSS APPLY STRING_SPLIT(sDelimQty, ';')
),
CPT_CTE (numRowC, CPT) AS
(
SELECT numRow, value
FROM sampleData
CROSS APPLY STRING_SPLIT(sDelimCPT, ';')
)
SELECT *
FROM sampleData
JOIN CPT_CTE c on c.numRowC = sampleData.numRow
JOIN Qty_CTE q on q.numRowQ = sampleData.numRow
을,이 일을하는 것은 행의 양을 두 배로 우리의 출력 :
하지만,
어떤 아이디어 : F 우리는 하나 둘 중 하나가 제대로 반환 조인 제거? 대단히 감사합니다.
다음은 최종 해결책입니다. 건배!
WITH Qty_CTE (numRowQ, Qty, RN) AS
(
SELECT
numRow, value,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM
sampleData
CROSS APPLY
STRING_SPLIT(sDelimQty, ';')
),
CPT_CTE (numRowC, CPT, CPTRate, RN) AS
(
SELECT
s.numRow, value as CPT, l.decCPTRate as CPTRate,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM
sampleData s
CROSS APPLY
STRING_SPLIT(sDelimCPT, ';')
JOIN
lookupCPT l ON value = l.sCPTCode
)
SELECT
numRow, sDelimCPT, sDelimQty, CPT, CPTRate, Qty, CPTRate * Qty as Total
FROM
sampleData
JOIN
CPT_CTE c on c.numRowC = sampleData.numRow
JOIN
Qty_CTE q on q.numRowQ = sampleData.numRow AND c.RN = q.RN
은 항상 오름차순으로 구분 된 숫자입니다 *? –
불행히도 보장하지 : - \ –
나를 위해, q1 논리적으로뿐만 아니라 q2입니다. – Sebas