0

这是我第一次在这样的论坛上,我真的需要帮助。

我有一张看起来像这样的桌子

CREW_ITEM_ID | RANK_SORTINGSEQ| YearsInRank
-------------------------------------------
CREW-001     | 204            | 100
CREW-001     | 205            | 200
CREW-002     | 101            | 300
CREW-002     | 102            | 400
CREW-002     | 103            | 500
CREW-003     | 105            | 600
CREW-003     | 106            | 700

我必须按等级和船员项目 ID 对 YearsInRank 列(实际上是天,但还可以)求和

较高的排名(=较低的 RANK_SORTINGSEQ 数字)当然会增加排名中的年份

我想从上面的例子中得到的结果是

CREW_ITEM_ID | RANK_SORTINGSEQ| YearsInRank
-------------------------------------------
CREW-001     | 204            | 100
CREW-001     | 205            | 300
CREW-002     | 101            | 300
CREW-002     | 102            | 700
CREW-002     | 103            | 1200
CREW-003     | 105            | 600
CREW-003     | 106            | 1300

因为例如

  • 船员-002 103 = 300+400+500 = 1200
  • 船员-002 102 = 300+400 = 700
  • 船员-002 101 = 300

我已经在 excel 中创建了它并且它可以工作,但是在 SQL Server 中我迷路了

=SUMIFS(EXP[DURATION],EXP[CREW_ITEM_ID],[@[CREW_ITEM_ID]],EXP[RANK_SORTSEQ],"<="&[@[RANK_SORTSEQ]])/365

(持续时间 = 列 YearsInRank)

非常感谢,克里斯

4

1 回答 1

0

我使用了一个填充了示例数据的表变量。您可以根据每个船员(成员)上一条记录的rank_sortingseq必须较低
的条件将此表加入到自身中。

-- generate the example data:
declare @x table (crew_item_id varchar(8), rank_sortingseq int, YearsInRank int)
insert into @x (crew_item_id, rank_sortingseq, YearsInRank) values 
('CREW-001', 204, 100),
('CREW-001', 205, 200),
('CREW-002', 101, 300),
('CREW-002', 102, 400),
('CREW-002', 103, 500),
('CREW-003', 105, 600),
('CREW-003', 106, 700);

-- actual query:
select q1.crew_item_id, q1.rank_sortingseq, q1.YearsInRank, YearsInRank2 = sum(q2.YearsInRank)
from @x q1 join @x q2 
  on q1.rank_sortingseq <= q2.rank_sortingseq and q1.crew_item_id=q2.crew_item_id
group by q1.crew_item_id, q1.rank_sortingseq, q1.YearsInRank

新列 YearsInRank2 是您所期望的结果(我展示了两者以显示差异)。

于 2014-06-13T12:24:17.640 回答