2017-11-07 8 views
0

トン-SQLの組み合わせを配置し、Nポジション:私がしなければならないだろうと想定トン-SQL k値の組み合わせ、nはk値の

K Values 
'A', 'B' 

N Positions -- can be any value 

Result if N = 2: 
'A', 'A' 
'A', 'B' 
'B', 'A' 
'B', 'B'  

Result if N = 3: 
'A', 'A', 'A' 
'A', 'A', 'B' 
'A', 'B', 'A' 
'A', 'B', 'B' 
'B', 'A', 'A' 
'B', 'A', 'B' 
'B', 'B', 'A' 
'B', 'B', 'B' 

から1 CROSS自体すなわちへのJOINのは、動的なT-SQLを使用します?

I.e.ときN = 2

WITH CTEValues(Value) AS (
    SELECT 'A' UNION SELECT 'B' 
) 
SELECT c1.Value AS A, C2.Value AS B 
FROM CTEValues c1 
CROSS JOIN CTEValues c2 
ORDER BY c1.Value, c2.Value 

または3

WITH CTEValues(Value) AS (
    SELECT 'A' UNION SELECT 'B' 
) 
SELECT c1.Value AS A, C2.Value AS B, C3.Value 
FROM CTEValues c1 
CROSS JOIN CTEValues c2 
CROSS JOIN CTEValues c3 
ORDER BY c1.Value, c2.Value, c3.Value 

旋回し、その後アンピボット使用する離れがない限り?

+0

何が質問ですか?それは任意のkとnのために働く方法? – Alex

+0

'ダイナミックSQL'を使用します – Squirrel

+0

出力はclear.inputはclear.whatではありませんテーブルデザインとは何ですか? – KumarHarsh

答えて

1

これは動的T-SQLステートメントを使用した完全な動作例です。私はKの値を一時テーブルに保持しています。あなたはまた、RBAR and dynamic Sql

を探しているなら、あなたの元の要件に同じことを実現することができないなら、私に知らせて

IF OBJECT_ID('tempdb..#KValues') IS NOT NULL 
BEGIN; 
    DROP TABLE #KValues; 
END; 

CREATE TABLE #KValues 
(
    [value] CHAR(1) 
); 

INSERT INTO #KValues ([value]) 
VALUES ('A') 
     ,('B') 
     ,('C') 
     --,('D'); 

DECLARE @DynamicTSQLStatement NVARCHAR(MAX); 

WITH DataSource AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [Value]) AS [ValueID] 
      ,[Value] 
    FROM #KValues 
), 
DataSourceColumns AS 
(
    SELECT STUFF 
    (
     (
      SELECT ',K' + CAST([ValueID] AS VARCHAR(12)) + '.[Value]' 
      FROM DataSource 
      ORDER BY [ValueID] 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
     ,1 
     ,1 
     ,'' 
    ) AS [Columns] 
) 
SELECT @DynamicTSQLStatement = 'SELECT ' + (SELECT [Columns] FROM DataSourceColumns) + 
' FROM #KValues AS K1' + 
STUFF 
(
    (
     SELECT ' CROSS JOIN #KValues AS K' + CAST([ValueID] AS VARCHAR(12)) 
     FROM DataSource 
     ORDER BY [ValueID] 
     FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
    ,1 
    ,26 
    ,'' 
) + ' ORDER BY ' + (SELECT [Columns] FROM DataSourceColumns); 

EXECUTE sp_executesql @DynamicTSQLStatement; 
3

:もちろん、あなたのニーズに合わせて順番に文を変更するのは自由です。

この他のサンプルデータもテストしてください。

CREATE TABLE #Table (Value VARCHAR(10)) 
INSERT INTO #Table VALUES ('A'),('B') 

DECLARE @N INT=3 
declare @i int=1 
declare @c varchar(10)='C' 
DECLARE @Sql VARCHAR(max)='' 
DECLARE @Col VARCHAR(max)='' 
DECLARE @CrossSql VARCHAR(max)='' 
DECLARE @OrderBy VARCHAR(max)=' ORDER BY c.Value ' 

WHILE (@i<@N) 
begin 
set @[email protected]+', c'+cast(@i as varchar)+'.Value ' 
SET @[email protected]+' CROSS JOIN #Table c'+cast(@i as varchar) 
set @[email protected]+', c'+cast(@i as varchar)+'.Value ' 

set @[email protected]+1 
end 
--print @ExtraSql 
set @Sql='SELECT c.Value AS A'[email protected]+ 
' FROM #Table c' 
[email protected] 
[email protected] 

print @Sql 
EXEC(@Sql) 

drop table #Table 
関連する問題