2017-07-19 9 views
0

Ich habe eine Abfrage, die Verbrauchsdaten bis zu einer bestimmten Datetime @end aggregiert. Allerdings muss ich auch den letzten Wert einer anderen Spalte, Mitarbeiter, zurückgeben, wenn die Zeilen nach trans_num (Transaktionsnummer) sortiert sind. Wie mache ich das?Wie gebe ich den letzten Wert einer Spalte beim Summieren einer anderen Spalte zurück?

Was ich bisher versucht habe: Ich habe versucht, SELECT Top 1 zu verwenden, aber das wird mir nicht der letzte Mitarbeiter für jeden Artikel geben. Die Tabelle hat trans_num als Primärschlüssel und alle anderen Felder sind nicht eindeutig. Ich kann andere Informationen nach Bedarf bereitstellen.

declare @start datetime2 = '7/17/17 05:00:00 AM' 
declare @end datetime2 = '7/18/17 05:00:00 AM' 
declare @job varchar(12) = 'W000017154' 
declare @suf int = 29 

select 

    t.item 
    , i.description 
    , sum(t.qty) as sumqty 
    , t.ref_num 
    , t.ref_line_suf 
    , (select top 1 

      t.emp_num 

     from 

      isw_lptrans as t 

     where 

      t.ref_num = @job 
      and t.ref_line_suf = @suf 
      and t.createdate between @start and @end 

     order by 

      trans_num desc 

    ) as lastemp 

from 

    isw_lptrans as t 
    inner join item as i on i.item = t.item 

where 

    t.trans_type = 'I' 
    and t.createdate between @start and @end 
    and t.ref_num = @job 
    and t.ref_line_suf = @suf 

group by 

    t.item 
    , i.description 
    , t.ref_num 
    , t.ref_line_suf 

Screenshot der Zeilen: Die markierte Linie zeigt die letzte Zeile, wenn die @end Datumzeit angegeben wird. Also muss ich die qty Spalte summieren, aber dann auch den letzten Wert in emp_num (Mitarbeiterspalte) zurückgeben. In der folgenden Abbildung sollte die Gesamtmenge also 1000 sein, während TG43499 als letzter Wert der Spalte emp_num zurückgegeben wird.

enter image description here

Antwort

1

Sie einen allgemeinen Tabellenausdruck verwenden können (CTE) und eine RANK-Funktion als Unterabfrage, die die letzte Mitarbeiter kehren jedes Element abzuwickeln?

arbeiten Diese Abfrage kann nicht genau, aber es könnte Ihnen den Einstieg:

declare @start datetime2 = '7/17/17 05:00:00 AM' 
declare @end datetime2 = '7/18/17 05:00:00 AM' 
declare @job varchar(12) = 'W000017154' 
declare @suf int = 29 

with lastEmp as (
    select 
    t.emp_num 
    , t.item 
    , RANK() OVER (PARTITION BY t.item ORDER BY t.CreateDate DESC) AS rankValue 
    FROM isw_lptrans as t 
    WHERE t.ref_num = @job 
    and t.ref_line_suf = @suf 
    and t.createdate between @start and @end 
) 
select 
    t.item 
    , i.description 
    , sum(t.qty) as sumqty 
    , t.ref_num 
    , t.ref_line_suf 
    , le.emp_num lastEmployeeNum 
from 
    isw_lptrans as t 
inner join item as i on i.item = t.item 
inner join lastEmp le ON t.item = le.item AND le.rankValue = 1 
where 
    t.trans_type = 'I' 
    and t.createdate between @start and @end 
    and t.ref_num = @job 
    and t.ref_line_suf = @suf 
group by 
    t.item 
    , i.description 
    , t.ref_num 
    , t.ref_line_suf 
+1

Ach, verflixt, ich war für eine Lösung der Hoffnung, die entweder eine temporäre Tabelle oder einen Tabellenausdruck nicht genutzt. Mein endloser Optimismus dachte, dass es möglich wäre, alles innerhalb derselben SELECT-Anweisung zu tun. Aber der schwierige Teil ist, dass ich nicht die 'LAST_VALUE()' -Funktion habe, die in neueren Versionen von SQL Server existiert. Trotzdem danke! – DarthVoid

Verwandte Themen