• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL,zagnieżdżona pętla while

Object Storage Arubacloud
0 głosów
987 wizyt
pytanie zadane 12 grudnia 2018 w SQL, bazy danych przez adam1297 Użytkownik (630 p.)

Witam, 

mam stworzoną procedurę z 2 pętlami while, pierwsza przechodzi przez daty  a druga  w niej zagnieżdzona przez Id lokalizacji. Problem polega na tym że pierwsza pętla (z datami) wykonuje się tylko raz.

CREATE PROCEDURE dbo.PopulateTMPTest @FirstLocationID int, @LastLocationID int
AS
DECLARE @StartDate DATE = '2017-01-01';
DECLARE @EndDate DATE = '2017-12-12';
Declare @TotalCash Decimal(18,2) = 0;
WHILE (@StartDate <= @EndDate)

BEGIN

	while @FirstLocationID<=@LastLocationID
		BEGIN
			Select @TotalCash= Sum(r.TotalBrutto) from Receipt r
			where TransactionDate=@StartDate and LocationId=@FirstLocationID
			group by TransactionDate


			Insert into [dbo].Tmp([Date],[Income],[LocationId]) Values (Year(@StartDate)+DATEPART(dy,@StartDate)/1000.0,@TotalCash,@FirstLocationID)
				
			set @FirstLocationID = @FirstLocationID+1
		END

	set @StartDate = DATEADD(day, 1, @StartDate)
END
GO

 

1 odpowiedź

0 głosów
odpowiedź 12 grudnia 2018 przez areklipno Stary wyjadacz (11,930 p.)
wybrane 12 grudnia 2018 przez adam1297
 
Najlepsza

Pierwsza pętla z datami działa poprawnie.

Nieco zmieniony kod:

DECLARE @StartDate DATE = '2017-01-01';
DECLARE @EndDate DATE = '2017-12-12';
Declare @TotalCash Decimal(18,2) = 0;

WHILE (@StartDate <= @EndDate)
BEGIN
 
    --while @FirstLocationID<=@LastLocationID
    --    BEGIN
         set  @TotalCash = @TotalCash +1;
    --    END
 
    set @StartDate = DATEADD(day, 1, @StartDate)
END

select @TotalCash

daje wynik 346.

A nie możesz zrobić tego prościej? Np:

CREATE PROCEDURE dbo.PopulateTMPTest @FirstLocationID int, @LastLocationID int
AS
DECLARE @StartDate DATE = '2017-01-01';
DECLARE @EndDate DATE = '2017-12-12';

    Insert into [dbo].Tmp([Date],[Income],[LocationId]) 
    select (Year(TransactionDate)+DATEPART(dy,TransactionDate)/1000.0, Sum(r.TotalBrutto) ,LocationId
    from Receipt r
    where TransactionDate between @StartDate and @EndDate and LocationId between @FirstLocationID and @LastLocationID
	group by (Year(TransactionDate)+DATEPART(dy,TransactionDate)/1000.0, LocationId
	
END

GO

(nie dam ręki odciąć, że nie ma nigdzie literówki - nie mam jak sprawdzić czy działa)

Podobne pytania

+1 głos
2 odpowiedzi 164 wizyt
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 25 maja 2016 w PHP przez Headhunter Gaduła (4,450 p.)
+1 głos
2 odpowiedzi 246 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Igor4567 Nowicjusz (170 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...