konto usunięte

Temat: pętla / zapytanie SQL

Witam,

Potrzebuję pomocy w poniższej sprawie:

Mam tabelę z okresami zatrudnienia, gdzie każda zmiana generuje nowy wiersz z nowymi zakresami czasowymi. Wygląda to w ten sposób:

http://zapodaj.net/98c4d9f16f93f.jpg.html

Takie dane mam w tabeli sql - nazwa Login

W wyniku zapytania chcę otrzymać minimalną datę od i maksymalną datę do, dla ciągłości zakresów czasowych. Jeżeli nastąpiła przerwa w zatrudnieniu, to chcę otrzymać datę od tą która widnieje po przerwie od pracy (taki przypadek jest dla pracownika C) a datę do ostatnią dla danego pracownika.

Czyli Pracownik A - pracował od 2013-01-20 do: 2999-12-31 (do teraz)
Pracownik B - pracował od 2014-02-15 do: 2014-12-2
Pracownik C - od: 2015-01-01 do: 2999-12-31

konto usunięte

Temat: pętla / zapytanie SQL

W bazie daty jako stringi?

konto usunięte

Temat: pętla / zapytanie SQL

Nie jestem pewien, ale raczej tak

konto usunięte

Temat: pętla / zapytanie SQL

Wg danych które zamieściłeś "Pracownik A" miał przerwę rok, a wrzesień nie ma 31 dni. Jeżeli faktycznie pracownik A miał przerwę rok to logika jest błędna chyba że to błąd w danych.

konto usunięte

Temat: pętla / zapytanie SQL

To błąd w danych. Ale gdyby rzeczywiście miał rok przerwy to data od kiedy zaczął ponownie prace powinna być data 2015-01-01. Chodzi mi o takie zapytanie żeby mi wyrzucalo tylko wynik z pracownikiem i data od i do. Gdzie data od to data rozpoczęcia pracy po przerwie (ponownym zatrudnieniu) jeżeli taka przerwa miała miejsce. W pozostałych przypadkach gdzie jest ciaglasc dat (brak przerwy > 1 dzien) będzie to data pierwszego zatrudnienia.

konto usunięte

Temat: pętla / zapytanie SQL

Pracownik B ma ciaglasc zatrudnienia wg tych danych. Pozostali pracownicy mieli przerwy w zatrudnieniu wiec data od powinna być inna niż ta przy kolumnie LP=1
Piotr Kukuryk

Piotr Kukuryk Programista, Bank
Pekao S.A.

Temat: pętla / zapytanie SQL

Cześć,
Trochę utrudniłeś dając dane wejściowe w postaci obrazka. :/
Tabelka:
CREATE TABLE [dbo].[temp](
[id] [int] IDENTITY(1,1) NOT NULL,
[od] [datetime] NULL,
[do] [datetime] NULL,
[kod] [varchar](50) NULL,
[lp] [int] NULL,
CONSTRAINT [PK_temp] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2014-02-15 00:00:00.000' AS DateTime), CAST('2014-05-31 00:00:00.000' AS DateTime), N'B15', 1)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2014-06-01 00:00:00.000' AS DateTime), CAST('2014-07-31 00:00:00.000' AS DateTime), N'B15', 2)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2014-08-01 00:00:00.000' AS DateTime), CAST('2014-09-30 00:00:00.000' AS DateTime), N'B15', 3)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2014-10-01 00:00:00.000' AS DateTime), CAST('2014-12-20 00:00:00.000' AS DateTime), N'B15', 4)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2013-01-20 00:00:00.000' AS DateTime), CAST('2014-07-31 00:00:00.000' AS DateTime), N'A11', 1)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2014-08-01 00:00:00.000' AS DateTime), CAST('2014-01-31 00:00:00.000' AS DateTime), N'A11', 2)
INSERT [dbo].[temp] ([od], [do], [kod], [lp]) VALUES (CAST('2015-01-01 00:00:00.000' AS DateTime), CAST('2999-12-31 00:00:00.000' AS DateTime), N'A11', 3)

Zapytanie:


SELECT * FROM dbo.temp;
WITH ble AS
(
SELECT
prevRange.od prevRangeOd
,prevRange.do prevRangeDo
,nextRange.od nextRangeOd
,nextRange.do nextRangeDo
,prevRange.kod
,nextRange.lp
,CASE WHEN DATEADD(DAY,1, prevRange.do) = nextRange.od THEN 0 ELSE 1 END AS ContainsGap
FROM dbo.temp prevRange
JOIN dbo.temp nextRange ON prevRange.kod = nextRange.kod AND prevRange.lp = nextRange.lp - 1
)

SELECT
a.kod
,COALESCE(
(SELECT MAX(b.nextRangeOd) FROM ble b WHERE b.kod = a.kod AND ContainsGap = 1),
(SELECT MIN(b.prevRangeOd) FROM ble b WHERE b.kod = a.kod AND ContainsGap = 0)
) AS DateFrom
,nextRangeDo as DateTo
FROM ble a
WHERE lp = (SELECT MAX(lp) FROM ble poi WHERE poi.kod = a.kod)

Temat: pętla / zapytanie SQL

;with cte as
(
select
t1.kod
,case when dateadd(d,1,t2.do) = t1.od then 0 else t1.od end od
,t1.do
from temp t1
left join temp t2 on t1.kod = t2.kod and t1.lp = t2.lp + 1
)

select
kod
,max(od) DateFrom
,max(do) DateTo
from cte
group by kod

konto usunięte

Temat: pętla / zapytanie SQL

Jeżeli to SQL2012 to polecam zapoznanie się z funkcją LEAD.
Ona rozwiązuje tego typu problemy.

Następna dyskusja:

SQL - zapytanie sprzedaz - ...




Wyślij zaproszenie do