2013-04-02 5 views
2

Учитывая, что у меня есть запрос, как это:Increment SQL столбец на основе другого

select employeeid as id, department as dep from employee where department in (...) 
order by department 

Я хотел бы иметь дополнительный столбец, который увеличивает на каждые 3 отделов, так что результат выглядит примерно так:

id dep  magic 
1 Accounting 0 
30 Accounting 0 
66 HR   0 
67 HR   0 
33 HR   0 
2 Sales  0 
9 IT   1 
12 R&D  1 
19 Design  1 
45 QA   2 
46 QA   2 

Я пробовал с различными функциями номера ряда, над() и другим вуду, но я не могу понять, как это правильно. Надеюсь, ты поможешь мне с этим!

Редактировать: Так что это было не так прямо, как я надеялся. В приведенном выше примере, вероятно, не было зафиксировано все проблемы, связанные с моим делом. Так что это реальный вопрос, что я бегу:

select sdi.sdcid 
     ,sdi.keyid1 
     ,sdi.paramlistid 
     ,sdi.paramlistversionid 
     ,sdi.variantid 
     ,sdi.dataset 
     ,sdi.paramid 
     ,sdi.paramtype 
     ,sdi.replicateid 
     ,sd.sdidataid 
     --(ROW_NUMBER() over(order by sd.sdidataid asc) -1) /3 partition 
     from sdidataitem sdi 
     left join sdidata sd on 
     sdi.keyid1 = sd.keyid1 
     and sdi.keyid2 = sd.keyid2 
     and sdi.keyid3 = sd.keyid3 
     and sdi.paramlistid = sd.paramlistid 
     and sdi.paramlistversionid = sd.paramlistversionid 
     and sdi.variantid = sd.variantid 
     and sdi.dataset = sd.dataset 
     where sd.sdidataid in (select top 30 sdidataid from sdidata) 
     and sdi.u_analysserieid is null 
     order by sd.sdidataid asc  

при запуске запроса с колонки раздела я получаю следующее сообщение об ошибке: Cannot find either column "sd" or the user-defined function or aggregate "sd.sdidataid", or the name is ambiguous. Это код, чтобы создать две таблицы участвуют:

CREATE TABLE [lv2056d].[sdidata] ( 
[sdcid]      nvarchar(40) NOT NULL, 
[keyid1]     nvarchar(40) NOT NULL, 
[keyid2]     nvarchar(40) NOT NULL, 
[keyid3]     nvarchar(40) NOT NULL, 
[paramlistid]    nvarchar(40) NOT NULL, 
[paramlistversionid]  nvarchar(40) NOT NULL, 
[variantid]     nvarchar(40) NOT NULL, 
[dataset]     numeric(18,0) NOT NULL, 
[limitruleid]    nvarchar(40) NULL, 
[limitruleversionid]  nvarchar(40) NULL, 
[modifiableflag]   nvarchar(1) NULL, 
[approvalsequenceflag]  nvarchar(1) NULL, 
[approvalpassrule]   nvarchar(20) NULL, 
[condition]     nvarchar(80) NULL, 
[availabilityflag]   nvarchar(1) NULL, 
[workflowid]    nvarchar(40) NULL, 
[workflowversionid]   nvarchar(40) NULL, 
[workflowinstance]   numeric(18,0) NULL, 
[usersequence]    numeric(18,0) NULL, 
[notes]      nvarchar(2000) NULL, 
[auditsequence]    numeric(18,0) NULL, 
[auditdeferflag]   nvarchar(1) NULL, 
[tracelogid]    nvarchar(40) NULL, 
[createdt]     datetime NULL, 
[createby]     nvarchar(40) NULL, 
[createtool]    nvarchar(20) NULL, 
[moddt]      datetime NULL, 
[modby]      nvarchar(40) NULL, 
[s_datasetstatus]   nvarchar(20) NULL, 
[modtool]     nvarchar(20) NULL, 
[s_notebookreference]  nvarchar(20) NULL, 
[s_assignedanalyst]   nvarchar(40) NULL, 
[s_instrumentid]   nvarchar(40) NULL, 
[s_icoverriddenflag]  nvarchar(1) NULL, 
[s_retestedflag]   nvarchar(1) NULL, 
[s_remeasuredflag]   nvarchar(1) NULL, 
[s_remeasureinstance]  numeric(18,0) NULL, 
[s_qcbatchid]    nvarchar(40) NULL, 
[s_qcbatchitemid]   nvarchar(20) NULL, 
[trackitemid]    nvarchar(40) NULL, 
[scheduleplanid]   nvarchar(40) NULL, 
[scheduleplanitemid]  nvarchar(40) NULL, 
[uniquenessflag]   nvarchar(1) NULL, 
[approvalflag]    nvarchar(1) NULL, 
[sdidataid]     nvarchar(40) NULL, 
[sourceworkitemid]   nvarchar(40) NULL, 
[sourceworkiteminstance] numeric(18,0) NULL, 
[s_cancellableflag]   nvarchar(1) NULL, 
[documentid]    nvarchar(40) NULL, 
[documentversionid]   nvarchar(40) NULL, 
[blockflag]     nvarchar(1) NULL, 
[activeflag]    nvarchar(1) NULL, 
[s_assigneddepartment]  nvarchar(40) NULL, 
[s_instrumentusedflag]  nvarchar(1) NULL, 
CONSTRAINT [xpksdidata] PRIMARY KEY CLUSTERED([sdcid],[keyid1],[keyid2],[keyid3],[paramlistid],[paramlistversionid],[variantid],[dataset])) 
GO 
CREATE TABLE [lv2056d].[sdidataitem] ( 
[sdcid]     nvarchar(40) NOT NULL, 
[keyid1]    nvarchar(40) NOT NULL, 
[keyid2]    nvarchar(40) NOT NULL, 
[keyid3]    nvarchar(40) NOT NULL, 
[paramlistid]   nvarchar(40) NOT NULL, 
[paramlistversionid] nvarchar(40) NOT NULL, 
[variantid]    nvarchar(40) NOT NULL, 
[dataset]    numeric(18,0) NOT NULL, 
[paramid]    nvarchar(40) NOT NULL, 
[paramtype]    nvarchar(80) NOT NULL, 
[replicateid]   numeric(18,0) NOT NULL, 
[aliasid]    nvarchar(80) NULL, 
[mandatoryflag]   nvarchar(1) NULL, 
[datatypes]    nvarchar(20) NULL, 
[enteredvalue]   numeric(28,10) NULL, 
[enteredtext]   nvarchar(255) NULL, 
[enteredunits]   nvarchar(40) NULL, 
[operatorrule]   nvarchar(255) NULL, 
[transformvalue]  numeric(28,10) NULL, 
[transformdt]   datetime NULL, 
[transformtext]   nvarchar(255) NULL, 
[transformrule]   nvarchar(4000) NULL, 
[displayvalue]   nvarchar(255) NULL, 
[displayunits]   nvarchar(40) NULL, 
[displayformat]   nvarchar(255) NULL, 
[rangeoperator]   nvarchar(20) NULL, 
[enteredqualifier]  nvarchar(20) NULL, 
[entrysdcid]   nvarchar(40) NULL, 
[entryreftypeid]  nvarchar(40) NULL, 
[calcrule]    nvarchar(4000) NULL, 
[measurementactionid] nvarchar(40) NULL, 
[releasedflag]   nvarchar(1) NULL, 
[valuestatus]   nvarchar(20) NULL, 
[condition]    nvarchar(80) NULL, 
[transformdeferflag] nvarchar(1) NULL, 
[textcolor]    numeric(18,0) NULL, 
[usersequence]   numeric(18,0) NULL, 
[notes]     nvarchar(2000) NULL, 
[auditsequence]   numeric(18,0) NULL, 
[auditdeferflag]  nvarchar(1) NULL, 
[tracelogid]   nvarchar(40) NULL, 
[createdt]    datetime NULL, 
[createby]    nvarchar(40) NULL, 
[createtool]   nvarchar(20) NULL, 
[moddt]     datetime NULL, 
[modby]     nvarchar(40) NULL, 
[modtool]    nvarchar(20) NULL, 
[s_acoverriddenflag] nvarchar(1) NULL, 
[s_analystid]   nvarchar(40) NULL, 
[s_qcevalstatus]  nvarchar(20) NULL, 
[displayvalueformat] nvarchar(255) NULL, 
[calcexcludeflag]  nvarchar(1) NULL, 
[sdidataitemid]   nvarchar(40) NULL, 
[instrumentid]   nvarchar(40) NULL, 
[instrumentfieldid]  nvarchar(20) NULL, 
[activeflag]   nvarchar(1) NULL, 
[externalreference]  nvarchar(255) NULL, 
[resulttimeoffset]  numeric(28,10) NULL, 
[u_analysserieid]  nvarchar(20) NULL, 
[u_showindataentry]  nvarchar(20) NULL, 
[w_instrumentid]  nvarchar(20) NULL, 
[u_defvalset]   nvarchar(20) NULL, 
CONSTRAINT [xpksdidataitem] PRIMARY KEY CLUSTERED([sdcid],[keyid1],[keyid2],[keyid3],[paramlistid],[paramlistversionid],[variantid],[dataset],[paramid],[paramtype],[replicateid])) 
GO 
+1

Могу ли я спросить вас цель магии? :) –

+0

это надуманный пример, далекий от реальности :) Я буду использовать его для извлечения значений из массива в моем коде (уродливый) – oskbor

+0

ewwwww ... Но вы должны делать то, что должны делать, не так ли? Если вам нужен другой взгляд, возможно, на ваш (уродливый) код, я готов к этому :) Итак, если вы предоставите большую картинку (не все), мы можем поставить вас на другой путь? :-) –

ответ

1

Вы можете просто использовать (ROW_NUMBER() OVER ...)/3

select employeeid as id, department as dep , 
(row_number() over (order by department asc) -1) /3 partition 
from employee 
where department in (...) 
order by department 

О запросе. 1) Вы, кажется, пропустить запятую после первого поля 2) более эффективное использование присоединиться, если вы на самом деле объединение таблиц, просто для ясности

select sd.sdidataid, (ROW_NUMBER() over(order by sd.sdidataid asc) -1) /3 partition 
from sdidataitem sdi inner join sdidata sd on 
    sdi.keyid1 = sd.keyid1 (... more column restrictions) 
and sdi.dataset = sd.dataset 
where sd.sdidataid in (select top 30 sdidataid from sdidata) 
and sdi.u_analysserieid is null 
order by sd.sdidataid asc 
+1

@ danihp - Он сказал, что хочет, чтобы значение увеличивалось на каждые 3 отдела. Я сделал именно это. У вас будет значение, увеличенное на каждые три строки, а не отделы – vittore

+0

@oskbor - так что покажите вам запрос, как я могу узнать, что с ним не так. – vittore

+0

Так это реальный запрос, который не удается: выбрать sdidata.sdidataid (ROW_NUMBER() по (порядка по возрастанию sdidata.sdidataid) -1)/3 раздела от sdidataitem, sdidata , где sdidataitem.keyid1 = sdidata.keyid1 (... больше ограничений столбцов) и sdidataitem.dataset = sdidata.dataset и sdidata.sdidataid в (выбрать топ 30 sdidataid из sdidata) и sdidataitem.u_analysserieid является нулевым заказа по sdidata.sdidataid возрастания – oskbor

0
Declare @tab table (id int,dep varchar(50)) 
insert into @tab Values(1,'Accounting'),(2,'Accounting'),(3,'Accounting'),(4,'AAA'),(5,'BBB'),(6,'ccc'),(7,'ddd'),(8,'eee'),(9,'fff'); 


Select t.*,a.Magic 
from @tab t 
join 
(
Select dep,(ROW_NUMBER() over (order by dep) -1)/3 as Magic 
from @tab 
group by dep 
) a on a.dep=t.dep 
order by t.dep 
Смежные вопросы