【发布时间】:2021-02-11 01:25:20
【问题描述】:
我是 sql server 的新手,我有以下包含一千多行的表结构。 但是出于示例目的,这就是它的样子
表格导入
+------+---------+------------+------------+------------+------------+------------+
| Name | Code | SocksTotal | GlovesTotal| JeansTotal | ShirtsTotal| shoesTotal |
+------+---------+------------+------------+------------+------------+------------+
| OT | 45612 | 2 | 1 | 0 | 1 | 4 |
| OT | 1234 | 0 | 1 | 0 | 0 | 0 |
| US | 45896| 0 | 0 | 0 | 0 | 0 |
+------+---------+------------+------------+------------+------------+------------+
然后是第二个名为 Items 的表
+------+---------+
| ID | Item |
+------+---------+
| 1 | socks |
| 2 | Gloves|
| 3 | Jeans |
| 4 | Shirts|
| 5 | shoes |
+------+---------+
从上面的表中,我需要编写一个脚本,该脚本将插入到另一个名为 ImportItems_Summary 的表中。 预期的输出是
+------+---------+------------+------------+
| Id | Code | Items_id |Import_total|
+------+---------+------------+------------+
| 1 | 45612 | 1 | 2 |
| 2 | 45612 | 2 | 1 |
| 3 | 45612 | 4 | 1 |
| 4 | 45612 | 5 | 4 |
| 5 | 1234 | 2 | 1 |
+------+---------+------------+------------+
正如您在此处看到的,代码 45612 现在在 ImportItems_summary 表中有 4 个条目,其中项目不等于 0,并且 Items_id 链接到 Items 表 ID 列。
我怎样才能实现上述输出?.. 我阅读并看到光标可能会有所帮助,但我不确定如何实现这一点
【问题讨论】:
-
为什么要在这里使用
CURSOR? SQL 是一种基于集合的语言,因此使用CURSOR,这是一种迭代方法,应该是最后一个选项之一,而不是第一个。 -
@Larnu 它不一定是光标,我只是不知道如何实现它,我认为光标会有所帮助
-
您拥有的初始数据是非规范化的。这些是您唯一拥有的项目,还是您真的有 100 列用于所有不同项目名称的列?如果是这样,这些是否都遵循
{ItemName}Total的结构作为列名?修复原始桌子的设计是一种选择吗?应该认真考虑。 -
@Larnu 不,我不能对表格进行任何更改,这是它设置的格式,目前我只有 5 个项目,我不确定它们是否会是更多项目
-
这是一个问题,因为您可以构建一个静态解决方案,但是,很快,当您添加一个新项目时,它不会缩放,并且项目不会不 考虑。另一种方法是使用动态 SQL 方法,但是,这不是介绍性的,您(我怀疑,并且尊重)将无法支持该解决方案。然而,修复设计可以消除这个问题。
标签: sql sql-server sql-insert unpivot lateral-join