0

我有一个图像汇总表 [summary],它将在不久的将来用作报告表。有一个参考表 [views] 和图像团队填充的第三个表 [TeamImage]。汇总表每个零件号有 1 行(表格有不同的零件号)和多列图像视图(TOP、BOT、FRO、BAC 等)。[views] 表列出了这些视图中的每一个,并带有一个 id 字段,它是一个 IDENTITY 字段。[TeamImage] 表包含零件编号和视图(零件编号字段不是唯一的,因为零件编号将被多次列出,因为它们具有图像视图)。

例子:

    TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345       |     |     |     |     |
67890       |     |     |     |     |

    TABLE [views]
id   | View |
1    | TOP  |
2    | BOT  |
3    | FRO  |
4    | BAC  |

    TABLE [TeamImage]
PartNum     | View |
12345       | TOP  |
12345       | BOT  |
12345       | FRO  |
12345       | BAC  |
67890       | FRO  |
67890       | BAC  |

这就是我最终需要的:

    TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345       |  1  |  1  |  1  |  1  |
67890       |     |     |  1  |  1  |

我可以运行几个更新查询,但我有 27 个视图和大约 200 万个零件号。我希望我可以运行类似下面的东西,即使我知道我不能使用变量作为列名:

DECLARE @id int = (SELECT max(id) FROM [views]), @ViewType nvarchar(3);

WHILE @id IS NOT NULL
BEGIN

    SELECT @ViewType = (SELECT [View] FROM [views] WHERE id = @id);

    UPDATE a
    SET a.[@ViewType] = '1'
    FROM [summary] a
    INNER JOIN [TeamImage] b
    AND a.[Part_Number] = b.[PartNum]

    WHERE b.[View] = @ViewType;

SELECT @id = max(id) FROM [views] WHERE id < @id;

END;

基本上,我希望使用一个变量来从 [views] 表中获取不同的视图(id = 27 到 id=1 ... 可以计算但没关系)并填充 [views] 中的相应字段汇总表。

我知道 SET a.[@ViewType] = '1' 不起作用,我的一位同事提到使用 VB 但不知道这是否真的是最有效的选择。我知道我可以在 [TeamImage] 表上使用 PIVOT,但我不确定是否可以更新我的 [summary] 表(其中包含更多字段,而不仅仅是图像视图)。看来我仍然需要一些能够有效循环更新查询的东西。我可以编写 4 个更新查询,每个视图一个(虽然我的真实表有 27 个视图),但我需要一些更动态的东西,以防我们将来添加视图。

4

2 回答 2

1

要创建最终摘要,您可以通过简单的数据透视来完成,但这已固定在您完成的少数代码中......但我知道 SQL 确实有一个 PIVOT 命令,但对它还不够熟悉。

select
      TA.PartNum,
      max( case when TA.TeamImage = 'TOP' then '1' else ' ' end ) as TOPview,
      max( case when TA.TeamImage = 'BOT' then '1' else ' ' end ) as BOTview,
      max( case when TA.TeamImage = 'FRO' then '1' else ' ' end ) as FROview,
      max( case when TA.TeamImage = 'BAC' then '1' else ' ' end ) as BACview
   from
      TeamImage TA
   group by
      TA.PartNum

显然很容易扩展,但您也可以查看“PIVOT”语法

于 2013-10-09T17:39:57.680 回答
0

我在这里问的问题稍微好一点:SQL output as variable in VB.net并且能够收到对我正在寻找的东西有用的答案。我很欣赏 DRapp 通过 PIVOT 提供的解决方案,但我认为 VB 方式会更容易让我前进。简而言之,使用带有 ExecuteScalar 和 ExecuteNonQuery 的 VB,我能够使用上面的变量重写我的查询。

于 2013-10-15T16:19:00.520 回答