【问题标题】:rSQL While Loop insertrSQL While 循环插入
【发布时间】:2016-07-15 15:38:58
【问题描述】:

*已更新 - 请看下图(上图)

我真的被这个特殊问题所困扰,我有两个表,项目和项目分配,它们通过项目 ID 连接。

我的目标是使用项目分配表的行填充修改后的项目表的列。我在下面添加了一张图片来说明我想要实现的目标。

一个项目最多可以有 6 个项目分配。每个项目分配都有一个自动增量 ID(分配 ID),但我不能在子选择中使用这个 ID,因为它不在 1-6 的范围内,所以我可以区分谁是第一个 PA2,谁是PA3。

例子:

(SELECT pa1.name FROM table where project.projectid = project_allocations.projectid and JVID = '1') as [PA1 Name],

(SELECT pa2.name FROM table where project.projectid = project_allocations.projectid and JVID = '1') as [PA2 Name],

修改后的 Projects 表包含 PA1、PA2、PA3 列。我需要根据项目分配表填充这些列。因此 FOR EACH 项目数据库中的第一条记录将是 PA1。

我已经整理了一个 SQL 代理作业,该作业删除并重新创建带有添加列的表,所以这更多的是关于将项目分配行写入修改后的项目表中的 row_num?

有什么建议吗?

--更新

我现在需要做的是按 DESC 的顺序将 row_number 添加为每个项目的列。

所以每个项目 ID 的第一行都是 1,之后的每一行都是 2,3,4,5,6。

我在这个网站上找到了以下代码:

use db_name
with cte as
       (
            select *
           , new_row_id=ROW_NUMBER() OVER (ORDER BY eraprojectid desc)
          from era_project_allocations_m
         where era_project_allocations_m.eraprojectid = era_project_allocations_m.eraprojectid
       )
update cte
set row_id = new_row_id

update cte
set row_id = new_row_id

我已在上一个 SQL 代理步骤中将 row_id 添加为列,并且此代码可以运行,但它不会为每个 projectid 生成 row_number。

如上图所示;我需要为每个项目 ID 提供 1-2 个 - 有效地给了我数千个 1、2、3、4。

这样我就可以将它们分类成列:)

【问题讨论】:

  • 比图片更好的是提供一些样本数据和预期的输出。请使用适当版本的 SQL-Server 重新标记您的问题。
  • 这是一个很好的起点。 spaghettidba.com/2015/04/24/… FWIW 我怀疑你需要一个循环来插入数据。
  • @SeanLange 我不确定,该表不会自行更新;我将使用它为前端创建数据库视图,以便 SQL 作业将在晚上运行以获取最新数据。
  • 您如何决定什么是 PA1、2、3 等?是 ProjectAllocations 中的行号吗?
  • 由行号决定,第一条记录是 PA1,然后 PA1 之后的所有行都是 2,3,4 - 因为它们是从我的前端插入到数据库表中的

标签: sql-server sql-server-2012 sql-insert row-number sql-agent-job


【解决方案1】:

据我所知,使用行号的查询就是您所追求的。 (另外,它可能是一个数据透视表..)

例子:

create table Something (
  someId int,
  someValue varchar(255)
  );

insert into Something values (1, 'one'), (1, 'two'), (1, 'three'), (1, 'four'), (2, 'ein'), (2, 'swei'), (3, 'un')

with cte as (
select someId,
       someValue,
       row_number() over(partition by someId order by someId)  as rn
from Something
)
select distinct someId,
       (select someValue from cte where ct.someId = someId and rn = 1) as value1,
       (select someValue from cte where ct.someId = someId and rn = 2) as value2,
       (select someValue from cte where ct.someId = someId and rn = 3) as value3,
       (select someValue from cte where ct.someId = someId and rn = 4) as value4
into somethingElse
from cte ct;

select * from somethingElse;

结果:

someId  value1  value2  value3  value4
1       one     two     three   four
2       ein     swei    NULL    NULL
3       un      NULL    NULL    NULL

【讨论】:

  • 是的,我正在寻找行号。我需要将 Row_Number 添加为非空值;创建初始行后填充的非唯一字段。
  • 现在,我要做的只是为每个 ProjectID 添加和填充 row_number 列 - 这样我就可以看到子选择以恢复我需要的内容。我会尽快用更多信息更新主要问题。
猜你喜欢
  • 2022-01-07
  • 2015-01-14
  • 2017-10-17
  • 2020-05-17
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2017-03-05
相关资源
最近更新 更多