2016-10-04 19 views
8

可能であれば、SQL Serverコード。sql - 列の文字列値の組み合わせを見つける

たとえば、2つの列を含む表があるとします。列1は、モンスターと2列目がレベルという名前で命名された:モンスター:

Monster | Level 
_______________ 
Small Beast | 300 
Large Beast | 700 
Small Dragon | 350 
Large Dragon | 800 

は、どのように私は1列のすべての可能な組み合わせを取得するには、このテーブルを照会することができますか?テーブル内のモンスターの数は変動する可能性があることに注意してください。

ので、出力は次のようになりますように

Small Beast, Large Beast 
Small Beast, Small Dragon 
Small Beast, Large Dragon 
Large Beast, Small Dragon 
Large Beast, Large Dragon 
Small Dragon, Small Beast, Large Beast 
Large Dragon, Small Beast, Large Beast 

...と。

私はその後、2列目からの合計値を追加したいと思います。そうのような組み合わせと出力することで全てのモンスターのためのレベル:

Small Beast, Large Beast: 1000 
Small Beast, Small Dragon: 650 
Large Dragon, Small Beast, Large Beast: 1800 
+0

は先発のための 'CROSS JOINs'を見てみましょう。 –

答えて

3

あなたは再帰CTEを使用することができます。

;WITH cte AS (
SELECT Monster, 
     [Level], 
     1 as l 
FROM YourTable 
UNION ALL 
SELECT c1.Monster+','+c2.Monster, 
     c1.[Level]+c2.[Level], 
     c1.l+1 
FROM cte c1 
CROSS JOIN YourTable c2 
WHERE c1.Monster NOT LIKE '%'+c2.Monster+'%' 
) 


SELECT * 
FROM cte 
ORDER BY l 
OPTION (MAXRECURSION 0) 

出力:

Monster            Level l 
Small Beast           300  1 
Large Beast           700  1 
Small Dragon          350  1 
Large Dragon          800  1 
Large Dragon,Small Beast       1100 2 
Large Dragon,Large Beast       1500 2 
Large Dragon,Small Dragon       1150 2 
Small Dragon,Small Beast       650  2 
Small Dragon,Large Beast       1050 2 
Small Dragon,Large Dragon       1150 2 
Large Beast,Small Beast        1000 2 
Large Beast,Small Dragon       1050 2 
Large Beast,Large Dragon       1500 2 
Small Beast,Large Beast        1000 2 
Small Beast,Small Dragon       650  2 
Small Beast,Large Dragon       1100 2 
Small Beast,Large Dragon,Large Beast    1800 3 
Small Beast,Large Dragon,Small Dragon    1450 3 
Small Beast,Small Dragon,Large Beast    1350 3 
Small Beast,Small Dragon,Large Dragon    1450 3 
... 
Large Beast,Small Dragon,Large Dragon,Small Beast 2150 4 
Large Beast,Small Dragon,Small Beast,Large Dragon 2150 4 
Small Beast,Small Dragon,Large Dragon,Large Beast 2150 4 
Small Beast,Small Dragon,Large Beast,Large Dragon 2150 4 
Small Beast,Large Dragon,Small Dragon,Large Beast 2150 4 
Small Beast,Large Dragon,Large Beast,Small Dragon 2150 4 
+0

これを試しましたが、 'c1.Monster + '、' + c2.Monster'ビットの周りに' CAST() 'をラップする必要がありました。再帰的クエリ "cte"の列 "Monster"内のアンカーと再帰部分との間で一致しません。 – Jamiec

+0

@Jamiec 'YourTable'では' monster'カラムに 'nvarchar(max)'を使用しました。 – gofr1

+0

ああ、私は 'VARCHAR(500)'を使用していましたので、結果を同じにキャストしなければなりませんでした。 'VARCHAR(MAX)'を使うと100%正しくなります。問題はなく、キャストは必要ありません。素晴らしい答えはこちら – Jamiec

0

それを行うための方法があります:

SELECT M1.monster, 
    M2.monster, 
    M1.level + M2.level 
FROM 
    monsters AS M1 
CROSS JOIN 
    monsters AS M2 

結果:

"Small Beast";"Small Beast";600 
"Small Beast";"Large Beast";1000 
"Small Beast";"Small Dragon";650 
"Small Beast";"Large Dragon";1100 
"Large Beast";"Small Beast";1000 
"Large Beast";"Large Beast";1400 
"Large Beast";"Small Dragon";1050 
"Large Beast";"Large Dragon";1500 
"Small Dragon";"Small Beast";650 
"Small Dragon";"Large Beast";1050 
"Small Dragon";"Small Dragon";700 
"Small Dragon";"Large Dragon";1150 
"Large Dragon";"Small Beast";1100 
"Large Dragon";"Large Beast";1500 
"Large Dragon";"Small Dragon";1150 
"Large Dragon";"Large Dragon";1600 

幸運を祈ります!

+1

しばらくすると、1行に3体のクリーチャーが登場することに注意してください。 – jarlh

+0

3-wayクロスジョイントですべてのユニオンを追加して、3つのモンスターの組み合わせを取得します。 – geofftnz

+1

@geofftnzええ、私もそれについて考えましたが、あなたはまた4,5などで組合わせる必要があります また、別の列番号があるので、組合でマージすることはできません –

関連する問題