2016-07-29 7 views
0

私は3つの列を持つテーブルがあると仮定します。列の名前を指定せずに各列の合計が可能ですか?SQL Serverで動的列を合計する方法は?

そして、列の動的名を持つ表を作成し、各列の合計を作成することは可能ですか?

更新日:ここは私のサンプルです。 まず、私は、クエリを実行し、このような結果が得られます。

--------- 
| Col | 
--------- 
| DLX | 
| SUI | 
| PRE | 
| TWQ | 
--------- 

たび多分違う、その後、私はこのような上の行から列を持つテーブルを作成する行の数:

--------------------------------- 
| DLX | SUI | PRE | TWQ | 
--------------------------------- 

そして、私は別のテーブルからテーブルのデータを記入します。結局のところ、私は各列を合計します。私は正確に列の名前を知らないので、私は列の名前を指定せずに各列の合計が必要です。

+0

個々の列の合計を含む列名を作成することを意味しますか? (すなわち、列1の合計= 25、列1の名前=列25)。 –

+1

3列しかない場合は、手作業でクエリを記述することをお勧めします。 – gofr1

+0

サンプル入力と予想される結果を提供してください。 – TheGameiswar

答えて

2

テーブルが小さい場合(つまり10列の場合)、私は手動で行うだけです。しかし、20列以上の場合は、動的SQLを使用します。

直接質問に答えるには、動的SQLを使用して動的列名を持つ表を動的に作成できます。

INFORMATION_SCHEMA.COLUMNSビューを使用すると、すべての列名を取得して一時テーブルに入れることができます。

SELECT NAME INTO #COLUMNS 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = YourTable 

次に、合計を格納する一時テーブルを作成します。

CREATE TABLE #SUMS (
COLUMN_NAME NVARCHAR(MAX), 
SUM_COLUMN INT 
) 

次に、動的SQLとループを使用して各列を合計することができます。

WHILE EXISTS(SELECT TOP 1 * FROM #COLUMNS) 
    BEGIN 
     DECLARE @COLUMN NVARCHAR(MAX) = (SELECT TOP 1 * FROM #COLUMNS) 
     DECLARE @DYNAMICSQL NVARCHAR(MAX) = N'SELECT ' + @COLUMN + ' AS COLUMN_NAME, SUM(' + @COLUMN + ') FROM YourTable' 

     INSERT INTO #SUMS 
     EXEC SP_EXECUTESQL @DYNAMICSQL 

     DELETE FROM #COLUMNS 
     WHERE NAME = @COLUMN 
    END 

その後、新しいテーブルをループに別の動的SQLおよびループを必要とし、あなたが欲しいの合計値とテーブル名を使用したい列名を持つ一時テーブルを作成します。

あなたはすでに上記のコードを使用してそれを行うことができるはずです。まず

+0

* lol *はここでは一致しません。 SQLは大文字で記述する必要があります。 'CREATE TABLE'のある部分は正しくフォーマットされていません。私の編集を拒否している場合は、自分でフォーマットしてください。 – gofr1

+0

私は文章で動的な言葉を3回使用し、OPを嘲笑しないことを意味しました。私はそれを削除します。そしてあなたは正しい。私は完全に忘れてしまった。 –

0

私はピボットについて考えたが、その後、この思い付いた:

DECLARE @Table TABLE ( --Table to generate input you need 
    [Col] nvarchar(3) 
) 
DECLARE @query nvarchar(max) -- a variable that will store dynamic SQL query 
DECLARE @table_name nvarchar(max) = 'Temp' --A name of table to create 

INSERT INTO @Table VALUES 
('DLX'), 
('SUI'), 
('PRE'), 
('TWQ') 

SELECT @query = ISNULL(@query,'CREATE '[email protected]_name+' TABLE (') + QUOTENAME([Col]) + ' nvarchar(max),' 
FROM @Table 

SELECT @query = SUBSTRING(@query,1,LEN(@query)-1) +')' 

EXEC sp_executesql @query 

(下記の結果を参照するにはPRINT @query)クエリを実行すること:一時を作成します

CREATE Temp TABLE ([DLX] nvarchar(max),[SUI] nvarchar(max),[PRE] nvarchar(max),[TWQ] nvarchar(max)) 

あなたのためのテーブル。

これで、かなり同じ方法でそのテーブルに挿入することができます。

関連する問題