我目前正在尝试重写一个存储过程,以考虑到我们的一个表的规范化。在最初的过程中,我们有两个表:
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记录,那么我如何为每个染料及其浓度的独特组合,以及每个组的批次计数,将记录插入到#t_group中?
这是什么东西,我可以使用枢轴关键字?我在网上找到的例子似乎都假设预先知道旋转字段的数量。
非常感谢,
大卫
苏格兰格拉斯哥
更新:
我所做的是使用一个函数,该函数返回一个级联的代码和让步字符串,并使用该字符串对数据进行分组。
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发布于 2012-10-04 15:42:01
一个部分的答案,而不是一个理想的答案:如果你知道不会有超过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-04 15:05:59
您正确地假设PIVOT和更传统的跨选项卡查询方法希望您预先知道需要多少列。此时,您需要使用一些动态SQL来获得所需的内容:
https://stackoverflow.com/questions/12727942
复制相似问题