1

一番上のクエリは、ステートメントごとに 1 つのレコードしか持たないテーブルを検索します。そのため、顧客に 7 つのステートメントがある場合、行数は 7 で、クエリはそれらを 1,2,3,4,5,6 のようにリストします。 、7

一番下のクエリは、上記のように 7 つのステートメントを含むテーブルを検索しますが、多くの場合、それらは分割されます。したがって、各ステートメントに 2 行ある場合、14、つまり 1,1,2,2, 3,3,4,4,5,5,6,6,7,7

今、私が達成しようとしているのは次のとおりです。上部のクエリはそのままで問題ありませんが、下部のクエリは区別する必要があります。一番下の画像の結果番号 2 を見てください。これを 1,2,3,4,5,6,7,8,9,10 として返したいと思います。

ステートメントがそれぞれ 8 と 4 になった特定のインスタンスがあった場合、1、2、3、4、5、6、7、8 が必要になります。基本的に、ほとんどの場合、一番下のクエリのステートメント番号を複製しています。結果全体を個別にオクロスしたいのですが、個別に入力しようとしましたが、選択項目にオーダーバイアイテムを含める必要があると不平を言っていますステートメントが個別に含まれていると、クエリが台無しになります。

これら 2 つのクエリの最終的な目的は、上位の結果セットを下位の結果セットと比較し、一致しないものだけを戻すことです (つまり、上位のクエリ テーブルにステートメントがないことを意味します)。

--Shows the each consolidated statement number that exisits for that particular customer reference number within the dbo.rss table.

Select Main.cust_ref,
       Left(CAST(Main.consolidatedstatements as varchar(max)),Len(CAST(Main.consolidatedstatements as varchar(max)))-1) As "consolidatedstatements"
From(Select distinct ST2.cust_ref, 
           (Select CAST(ST1.consolidated_stmt_num as varchar(max)) + ',' AS [text()]
            From dbo.rss ST1
            Where ST1.cust_ref = ST2.cust_ref
            ORDER BY ST1.cust_ref
            For XML PATH ('')) [consolidatedstatements]
     From dbo.rss ST2) [Main]


--Shows the each consolidated statement number that exisits for that particular customer reference number within the dbo.SC table.
Select Main.cust_ref,
       Left(CAST(Main.consolidatedstatements as varchar(max)),Len(CAST(Main.consolidatedstatements as varchar(max)))-1) As "consolidatedstatements"
From(Select distinct ST2.cust_ref, 
           (Select  CAST(ST1.consolidated_stmt_num as varchar(max)) + ',' AS [text()]
            From dbo.SC ST1
            Where ST1.cust_ref = ST2.cust_ref
            ORDER BY ST1.cust_ref
            For XML PATH ('')) [consolidatedstatements]
     From dbo.SC ST2) [Main]

ここに画像の説明を入力

4

1 に答える 1

2
CREATE TABLE #rss(cust_ref VARCHAR(32), consolidated_stmt_num INT);

CREATE TABLE #SC(cust_ref VARCHAR(32), consolidated_stmt_num INT);

INSERT #SC VALUES
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),('A',7),('A',8),('A',9),
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9),
('C',1),('C',2),('C',3),('C',4),('C',5),('C',6),('C',7),('C',8),('C',9);

-- missing A,7 and C,2/C,4:
INSERT #rss VALUES
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),        ('A',8),('A',9),
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9),
('C',1),        ('C',3),        ('C',5),('C',6),('C',7),('C',8),('C',9);

GO

-- これだけで、ステートメントが欠落している cust_refs (およびそれらがどれであるか) がわかります。

SELECT cust_ref, consolidated_stmt_num FROM #SC
EXCEPT
SELECT cust_ref, consolidated_stmt_num FROM #rss;

-- これにより、各テーブルから連結された完全なリストを 1 行で取得できます。

;WITH x AS
(
  SELECT DISTINCT cust_ref FROM 
  (
    SELECT cust_ref, consolidated_stmt_num FROM #SC
    EXCEPT
    SELECT cust_ref, consolidated_stmt_num FROM #rss
  ) AS y
)
SELECT x.cust_ref, 
    rss = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num) 
      FROM #rss AS r WHERE r.cust_ref = x.cust_ref
      ORDER BY r.cust_ref
    FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,''),
    sc =  STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num)
      FROM #SC  AS s WHERE s.cust_ref = x.cust_ref
      ORDER BY s.cust_ref
    FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
FROM x;

-- 別々の行でそれらが必要な場合:

;WITH x AS
(
  SELECT DISTINCT cust_ref FROM 
  (
    SELECT cust_ref, consolidated_stmt_num FROM #SC
    EXCEPT
    SELECT cust_ref, consolidated_stmt_num FROM #rss
  ) AS y
)
SELECT x.cust_ref, source = 'rss',
    list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num) 
      FROM #rss AS r WHERE r.cust_ref = x.cust_ref
      ORDER BY r.cust_ref
    FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
    FROM x
UNION ALL SELECT x.cust_ref, 'sc',
    list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num)
      FROM #SC  AS s WHERE s.cust_ref = x.cust_ref
      ORDER BY s.cust_ref
    FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
    FROM x
ORDER BY cust_ref, source;

- 掃除:

DROP TABLE #rss, #SC;
于 2013-08-12T16:11:27.293 に答える