0

たくさんの列があるテーブルがあり、そのうちのいくつかは「EQ」で始まる名前です。個々の行について、「EQ」で始まる列のすべての値を合計したいのですが、他の値は合計しません。私はこのようにそれを行うことができることを知っています:

select EQ_DOMESTIC + EQ_INTL + EQ_OTHER from myTable where id=1

しかし、私にはたくさんの列があり、各列の名前を入力せずに体系的にそれを行うことができるかどうか疑問に思いました。別のクエリでシステムテーブルから列名を取得する必要がありますか?

フォローアップの質問:一部の値はnullであるため、合計がNULLになります。合計にISNULL(column、0)を書き出さないようにする方法はありますか?

4

1 に答える 1

4

これは、動的SQLを使用すると非常に簡単に実行できます。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
   + COALESCE(' + QUOTENAME(name) + ', 0)'
FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name LIKE 'EQ[_]%';

SELECT @sql += N',' + QUOTENAME(name)
  FROM sys.columns
  WHERE [object_id] = OBJECT_ID('dbo.MyTable')
  AND name NOT LIKE 'EQ[_]%';

SELECT @sql = 'SELECT [EQ_SUM] = 0' + @sql
  + ' FROM dbo.MyTable WHERE id = 1;';

PRINT @sql;
-- EXEC sp_executesql @sql;
于 2012-07-02T19:02:08.127 に答える