Autor Zpráva
jio
Profil
Dobrý den.

Je možné jedním SELECTem v MS SQL nějak docílit toho, abych dostal rozdíl mezi první operací 01 a první operací 02 pro každé id za daný den?



datum/čas operace id
25.10.2007 07:20:35 01 Pavel
25.10.2007 07:25:35 01 Jana
25.10.2007 11:20:35 02 Jana
25.10.2007 11:30:35 02 Pavel
25.10.2007 12:20:35 01 Pavel
25.10.2007 12:20:39 01 Jana
25.10.2007 17:40:35 02 Pavel
25.10.2007 17:45:35 02 Jana
...


Nedaří se mi najít cesta jak na to a potřeboval bych alespoň vědět jestli to je vůbec možné nebo to nejde.

Děkuji
jio
Profil
Doplním

Výsledek by měl být cca takovýto:


id datum/čas
Pavel 4:10:00
Jana 3:55:00

Kajman_
Profil *
MS neznám, tak si upravte funkce podle ms. Např. takhle nějak by to mohlo jít

select op01.id, op01.den, zobraz_cas(op02.cas-op01.cas) rozdil from
(select trunc(datum) den, id, min(datum) cas from tabulka where operace=01 group by trunc(datum), id)
op01,
(select trunc(datum) den, id, min(datum) cas from tabulka where operace=02 group by trunc(datum), id)
op02
where op01.den=op02.den and op01.id=op02.id

zobraz_cas - neco co vám převede date/time na časový formát, který chcete
trunc - neco, co vám z date/time udělá jen date
jio
Profil
Děkuji,
netušil jsem, že je možné použít select v from.

Snad se tím prokoušu.
jio
Profil
Tak jsem pohořel. MS SQL patrně tuto konstrukci ve from nezná

zadáno bylo


SELECT op01.RC, op01.den, CONVERT(char(8), op02.cas-op01.cas, 8) rozdil
FROM
(select CONVERT(char(8), DatumCasOperace,3) AS den, RC, min(DatumCasOperace) cas from PuvodniDochazka
where KodOperace=01 group by den, RC) op1,
(select CONVERT(char(8), DatumCasOperace,3) AS den, RC, min(DatumCasOperace) cas from PuvodniDochazka
where KodOperace=02 group by den, RC) op2
where op01.den=op02.den and op01.RC=op02.RC


MS SQL Studio Express syntaxi upravil jak je na obrázku, ale nevstřebal to

Kajman_
Profil *
Já ta měl aliasy op01 a op02. Vy tam máte op1, ale nechal jste odkazování op01. Zkuste to sjednotit.
jio
Profil
Máte pravdu,
zrovna jsem si toho všiml a velmi se za to stydím
jio
Profil
Pokud skript upravím


SELECT op1.RC, op1.den, CONVERT(char(8), op2.cas-op1.cas, 8) rozdil
FROM
(select CONVERT(char(8), DatumCasOperace,3) AS den, RC, min(DatumCasOperace) cas from PuvodniDochazka
where KodOperace=01 group by den, RC) op1,
(select CONVERT(char(8), DatumCasOperace,3) AS den, RC, min(DatumCasOperace) cas from PuvodniDochazka
where KodOperace=02 group by den, RC) op2
where op1.den=op2.den and op1.RC=op2.RC

dostanu



Když v op1 změním na op2 ve druhém GROUP BY, tak dostanu stejný výsledek, pouze s tím rozdílem, že v posledním řádku chybového hlášení není op1.den ale op2.den

když přiřadím alias pro tabulky


SELECT op1.RC, op1.den, CONVERT(char(8), op2.cas-op1.cas, 8) rozdil
FROM
(select CONVERT(char(8), pd1.DatumCasOperace,3) AS den, pd1.RC, min(pd1.DatumCasOperace) cas
from PuvodniDochazka as pd1
where KodOperace=01 group by pd1.den, pd1.RC) op1,
(select CONVERT(char(8), pd2.DatumCasOperace,3) AS den, pd2.RC, min(pd2.DatumCasOperace) cas
from PuvodniDochazka as pd2
where KodOperace=02 group by pd2.den, pd2.RC) op2
where op1.den=op2.den and op1.RC=op2.RC


Tak dostanu



Popřípadě ještě takto


SELECT op1.RC, op1.den1, CONVERT(char(8), op2.cas-op1.cas, 8) rozdil
FROM
(select CONVERT(char(8), DatumCasOperace,3) AS den1, RC, min(DatumCasOperace) cas
from PuvodniDochazka
where KodOperace=01 group by den1, RC) op1,
(select CONVERT(char(8), DatumCasOperace,3) AS den2, RC, min(DatumCasOperace) cas
from PuvodniDochazka
where KodOperace=02 group by den2, RC) op2
where op1.den1=op2.den2 and op1.RC=op2.RC




Netuším v čem je chyba.
Kajman_
Profil *
V group jsem měl funkci, tu jste zaměnil za alias. Zkuste ji vrátit podle původního příkladu.
jio
Profil
Děkuji za trpělivost.

Toto už je funkční.


SELECT op1.RC, op1.den, CONVERT(char(8), op2.cas-op1.cas, 8) rozdil
FROM
(select CONVERT(char(10), DatumCasOperace,102) AS den, RC, min(DatumCasOperace) cas
from PuvodniDochazka
where KodOperace='01' group by CONVERT(char(10), DatumCasOperace,102), RC) op1,
(select CONVERT(char(10), DatumCasOperace,102) AS den, RC, min(DatumCasOperace) cas
from PuvodniDochazka
where KodOperace='02' group by CONVERT(char(10), DatumCasOperace,102), RC) op2
where op1.den=op2.den and op1.RC=op2.RC
and (den>='2007.10.29') and CONVERT(char(8), op2.cas-op1.cas, 8)>'06:00:00'
Kajman_
Profil *
Když dáte tu podmínku
DatumCasOperace>='2007.10.29'
do těch obou vnořených dotazů, tak by to mohlo být znatelně rychlejší.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0