1

現在、テーブルの1つの正規化を考慮して、ストアドプロシージャを書き直そうとしています。元の手順では、2つのテーブルがあります。

CREATE TABLE #t_batch
(batch_id   integer, 
thread_group NVARCHAR(60),
dye_code_1  NVARCHAR(10),
dye_conc_1  NUMERIC(19, 7),
dye_code_2  NVARCHAR(10),
dye_conc_2  NUMERIC(19, 7),
dye_code_3  NVARCHAR(10),
dye_conc_3  NUMERIC(19, 7),
dye_code_4  NVARCHAR(10),
dye_conc_4  NUMERIC(19, 7),
dye_code_5  NVARCHAR(10),
dye_conc_5  NUMERIC(19, 7),
dye_code_6  NVARCHAR(10),
dye_conc_6  NUMERIC(19, 7))

CREATE TABLE #t_group
(group_id   INTEGER IDENTITY(1, 1),
dye_code_1  NVARCHAR(10),
dye_conc_1  NUMERIC(19, 7),
dye_code_2  NVARCHAR(10),
dye_conc_2  NUMERIC(19, 7),
dye_code_3  NVARCHAR(10),
dye_conc_3  NUMERIC(19, 7),
dye_code_4  NVARCHAR(10),
dye_conc_4  NUMERIC(19, 7),
dye_code_5  NVARCHAR(10),
dye_conc_5  NUMERIC(19, 7),
dye_code_6  NVARCHAR(10),
dye_conc_6  NUMERIC(19, 7),
thread_group NVARCHAR(60), 
num_batches INTEGER)

いくつかのアクションの後、#t_batchにいくつかのレコードが入力されました。次に、次の方法でデータを#t_groupに挿入しました。

INSERT INTO #t_group
(dye_code_1, dye_conc_1, dye_code_2, dye_conc_2, dye_code_3, dye_conc_3,
dye_code_4, dye_conc_4, dye_code_5, dye_conc_5, dye_code_6, dye_conc_6, 
thread_group, num_batches)
SELECT dye_code_1, dye_conc_1, dye_code_2, dye_conc_2, dye_code_3, dye_conc_3, 
dye_code_4, dye_conc_4, dye_code_5, dye_conc_5, dye_code_6, dye_conc_6, 
thread_group, COUNT(batch_id_fk)
FROM #t_batch
GROUP BY dye_code_1, dye_conc_1, dye_code_2, dye_conc_2, dye_code_3, dye_conc_3, 
dye_code_4, dye_conc_4, dye_code_5, dye_conc_5, dye_code_6, dye_conc_6, 
thread_group
ORDER BY dye_code_1, dye_conc_1, dye_code_2, dye_conc_2, dye_code_3, dye_conc_3, 
dye_code_4, dye_conc_4, dye_code_5, dye_conc_5, dye_code_6, dye_conc_6, 
thread_group

そのため、染料の列ごとにグループ化された一連のレコードと、染料とその濃度の一意の組み合わせごとに一意のgroup_idがありました。また、各グループのバッチレコードのカウントがあります。

ただし、実際にはバッチの染料の数に制限はないため、テーブルは正規化されています。

CREATE TABLE #t_batch
(batch_id   INTEGER, 
thread_group NVARCHAR(60))

CREATE TABLE #t_batch_dye
(batch_id_fk INTEGER, 
stage   INTEGER,
sequence    INTEGER, 
dye_code    NVARCHAR(10),
dye_conc    NUMERIC(19,7))

CREATE TABLE #t_group
(group_id   INTEGER IDENTITY(1, 1),
thread_group NVARCHAR(60), 
num_batches INTEGER)

CREATE TABLE #t_group_dye
(group_id   INTEGER, 
stage   INTEGER,
sequence    INTEGER,
dye_code    NVARCHAR(10),
dye_conc    NUMERIC(19,7))

ここで、私の質問は次のとおりです。#t_batchと#t_batch_dyeが入力され、#t_batchの各レコードにさまざまな数の#t_batch_dyeレコードがあるとすると、一意の組み合わせごとに一意のgroup_idを持つレコードを#t_groupに挿入するにはどうすればよいですか。染料とその濃度、および各グループのバッチ数は?

これは私がPIVOTキーワードを使用できるものですか?私がウェブ上で見つけた例はすべて、ピボットされたフィールドの数が事前にわかっていることを前提としているようです。

どうもありがとう、

デビッド

スコットランド、グラスゴー


アップデート:

私が行ったことは、コードと連結の連結文字列を返す関数を使用し、それを使用してデータをグループ化することです。

DECLARE @dyes NVARCHAR(2000)  

 SELECT @dyes = ISNULL(@dyes,'') + dye_code + ' ' + convert(nvarchar,      requested_dye_conc) + ' '
 FROM   #t_batch_dye
 WHERE  batch_id_fk = @batch_id
 ORDER BY dye_code ASC
4

2 に答える 2

3

PIVOTクロス集計クエリのより伝統的な方法では、必要な列の数を事前に知っていると想定しているのは正しいです。その時点で、動的 SQL を使用して目的を達成する必要があります。

于 2012-10-04T15:05:59.727 に答える
1

部分的な答えであり、理想的な答えではありません: 染料の組み合わせが 20 を超えることはないことがわかっている場合は、別の一時テーブルを作成できます。

select b.thread_group, 
case when d.sequence=1  then d.dye_code end as code1,
case when d.sequence=1  then d.dye_conc end as conc1,
case when d.sequence=2  then d.dye_code end as code2,
case when d.sequence=2  then d.dye_conc end as conc2,
case when d.sequence=3  then d.dye_code end as code3,
case when d.sequence=3  then d.dye_conc end as conc3,
<lots of boring copy&paste...>
case when d.sequence=20 then d.dye_code end as code20,
case when d.sequence=20 then d.dye_conc end as conc20
from #t_batch t, #t_batch_dye d
where t.batch_id  = d.batch_id

次に、code1 から conc20 までのすべてを使用して、その中からグループを選択します。美しくはないが、はっきりしている。そして、そもそもテーブルを正規化するというポイント全体が無効になることを私は知っています! 幸運を。

于 2012-10-04T15:42:01.863 に答える