1

私のSQLテーブルでは:

Period| Brand A small Bags| Brand A big bags| Brand D Shoes| ...|  Brand X Shoes
2010  |   10              | 20              | 30           | ...| 200           

列名に特定の単語 (靴など) を含む列を合計するにはどうすればよいですか?

予想された結果:

Period | Sum of Bags | Sum of Shoes | ..
2010   | 30          | 230          | ..
4

4 に答える 4

10

動的 SQL と information_schema テーブルのクエリまたはハードコーディングなしではできません。おそらく次のようなものに、データを再構築できますか?

Brands (BrandId, BrandName)
ItemTypes (ItemId, ItemName)
Stock(BrandId, ItemId, Period, Quantity)

編集

おそらくもっと多くの理由もありますが、現在のテーブル構造に問題がある理由がいくつかあります。

  • テーブル内の列の最大数は 1024 であるため、これまでに発生したブランド/アイテムの順列ごとに列を追加し続けることはできません。

  • ブランドがバッグや靴を作っている場合、そのブランドに関する情報を何度も繰り返すことになります。このような情報が繰り返されるたびに、わずかな違いや異常が忍び寄る可能性があります。さらに、ブランドが名前を変更した場合は、列とそれを参照するすべてのコードを更新する必要があります。

  • すべての順列をハードコーディングし、新しいブランドを追加するときにそのコードを更新することを忘れずに、すべてのバッグを合計するなどの単純な計算を行うことはできません。

  • 靴を供給するすべてのブランドの名前を戻すなど、いくつかのクエリをまったく実行できません (または、少なくとも非常に困難な場合があります)。

于 2010-06-25T08:41:29.447 に答える
2

列名にはワイルドカードを使用できません (内容のみ)。

列の数は変わらないはずなので、次の行に沿ってクエリを作成できます。

select period, sum([Brand A small bags]) + sum([Brand A big bags]) as [sum of bags],
   sum([Brand D shoes]) + sum([Brand X shoes]) as [sum of shoes]
from yourtable
group by period

しかし、Martin Smith が示唆するように、データを再構築する方がよいでしょう。

于 2010-06-25T08:45:17.607 に答える
1

さて、私はSQLをより深く学んでいるので、自分自身の演習としてこれを解決しようとしました。与えられたスキーマの問題は十分に文書化されているので、それについて他に何も言うことはないと思います。

このコードが機能するには、ソース データの列が物理的な列である必要があります (つまり、テーブル変数やビューの列ではありません)。バッグや靴以外のタイプがあれば、このコードを関数などに抽象化できます。アルゴリズム的なものを取り下げたかっただけです。これが適切に機能するためには他にも多くの注意事項がありますが、前述のように、非正規化データにはすべての注意事項があります。

だからここに行きます:

編集:バージョン 2. これを手伝ってくれた Martin に感謝します。これは非常に巧妙なトリックですが、使用する必要があるのはおそらくまれなことです。

列名が検索パターンと一致すると想定しています (十分にハードコーディングされているため、わざわざチェックする必要はありません)。

DECLARE @sql nvarchar(max)
SET @sql = 'SELECT Period, '


-- Build column sum for bags
DECLARE @bagsColumns nvarchar(max)

SELECT
    @bagsColumns = COALESCE(@bagsColumns + '+', N'') + '[' + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%bags%'

SET @sql = @sql + @bagsColumns + ' AS ''Sum of Bags'', '


-- Build column sum for shoes
DECLARE @shoesColumns nvarchar(max)

SELECT
    @shoesColumns = COALESCE(@shoesColumns + '+', N'') + '[' + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%shoes%'

SET @sql = @sql + @shoesColumns + ' AS ''Sum of Shoes'''


SET @sql = @sql + ' FROM SumTest'

EXEC(@sql)
于 2010-06-27T19:43:31.210 に答える
0
SELECT PERIOD, [Brand A small Bags] + [Brand A big bags] [Sum of Bags] ... etc
于 2010-06-25T08:42:18.190 に答える