【发布时间】:2012-09-25 12:41:52
【问题描述】:
我目前正在尝试重写一个存储过程,以考虑我们其中一个表的规范化。在原始过程中,我们有两个表:
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 关键字的东西吗?我在网上找到的示例似乎都假设预先知道透视字段的数量。
非常感谢,
大卫
苏格兰格拉斯哥
更新:
我所做的是使用一个函数,该函数返回一个串联的代码和 concs 字符串,并用它来对数据进行分组。
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
【问题讨论】:
标签: sql-server sql-server-2008 tsql sql-server-2005 stored-procedures