このプロジェクトのデータには、セミコロンで区切られた2つの列が含まれています。これらは実際に順序付けられたペアです。たとえば、「a; b; c」、「x; y; z」、「a」は「x」と対になっています。クエリの目標は、この関係が一度に1行ずつ明確に表される表を作成することです。ここで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