Wyliczanie wartości na podstawie różnicy miesięcy...

0

Witam serdecznie, mam takie pytanie mianowicie mam bazę danych która ma taką strukturę:

ID data_od data_do wartosc_liczbowa
1 2018-06-01 2019-11-01 223
2 2019-02-01 2019-01-01 1357
3 2018-09-01 2019-06-01 3242
4 2018-01-01 2018-09-01 332
5 2018-06-01 2020-01-01 4443

Czy istnieje możliwość w SQL stworzenia takiego zapytania by w pierwszej kolejności obliczył i zwrócił różnice miedzy datami w miesiącach a następnie podzielił wartość liczbową przez ilość miesięcy?? ;)
Czy jednak muszę to sobie już po stronie programu obliczać??

1

Czy istnieje możliwość w SQL stworzenia takiego zapytania by w pierwszej kolejności obliczył i zwrócił różnice miedzy datami w miesiącach a następnie podzielił wartość liczbową przez ilość miesięcy?? ;)
Czy jednak muszę to sobie już po stronie programu obliczać??

Tak, można to bardzo łatwo zrobić, ale ze względu na fakt, że nie napisałeś jaka baza to nie napisze jak.

0

Podaj oczekiwane wyniki dla:

  1. 2016-07-31 i 2016-08-01
  2. 2016-07-01 i 2016-08-31
0
Haskell napisał(a):

Czy istnieje możliwość w SQL stworzenia takiego zapytania by w pierwszej kolejności obliczył i zwrócił różnice miedzy datami w miesiącach a następnie podzielił wartość liczbową przez ilość miesięcy?? ;)
Czy jednak muszę to sobie już po stronie programu obliczać??

Tak, można to bardzo łatwo zrobić, ale ze względu na fakt, że nie napisałeś jaka baza to nie napisze jak.

Przepraszam baza MS SQL 2016

Marcin.Miga napisał(a):

Podaj oczekiwane wyniki dla:

  1. 2016-07-31 i 2016-08-01
  2. 2016-07-01 i 2016-08-31

1 miesiąc dla obydwu wartości ale to nie ma znaczenia gdyż wszystkie wartości w bazie są sprowadzone do pierwszego dnia miesiąca zawsze i nie ma innych wartości w danym miesiącu

1

No to tak:

select wartosc_liczbowa/datediff(m,data_od,data_do) from table1

Oczywiście zależy jeszcze jaką dokładnośc chcesz mieć tego dzielenia, bo w tym przykładzie wszystko jest na liczbach całkowitych, dodatkowo warto się zabezpieczyć przed dzieleniem przez 0.

0

Dzięki za wskazówki działa idealnie i chylę czoła nad waszą wiedzą ja dopiero raczkuję w temacie:

SELECT 
Case when [wartosc_liczbowa]=0 or (datediff(m,[data_od],[data_do]) =0)
then null 
else FORMAT([wartosc_liczbowa]/datediff(m,[data_od],[data_do]),'N') 
end as Wynik 
FROM [NaukaSQL].[dbo].[TabelaTestowa21] 
0

Nie chcę zakładać następnego tematu ale znowu napotkałem na przykład którego nie potrafię ogarnąć ;( zresztą nie wiem czy to możliwe w SQL mianowicie mam tabelę z danymi:

ID | ID_Towaru|Dats|Rodzaj|Ilosc
---------------- | ------------------- | ------------------- |
1 | 3|2016-06-01|Ilosc1|100
2 | 3|2016-06-01|Ilosc2|120
3 | 3|2016-07-01|Ilosc2|200

A chciałbym by zapytanie SQL wyświetliło tabelę:

ID_Towaru|Dats|Rodzaj1_Ilosc|Rodzaj2_Ilosc|TOTAL_Ilosc
| ------------------- | ------------------- | ------------------- | ------------------- |
3|2016-06-01|100|120|220
3|2016-07-01|0|200|200

Czy ktoś wie jak to ogarnąć z góry dziękuję za pomoc.

0

Popełniłem taki kod ;) Działa idealnie... ;) Ale mam takie pytanie czy jeśli robię działania na kolumnach załóżmy dodaję, odejmuję To czy muszę cały warunek przepisywać czy mogę posłużyć się w jakiś sposób nazwą skróconą Załóżmy dla przykładu poniżej (Rodzaj1_Ilosc - Rodzaj2_Ilosc) As wynikOdejmowania ??


select
    [ID_Towaru], 
	[Dats], 
	SUM(CASE WHEN Rodzaj = 'Ilosc1' THEN Ilosc ELSE 0 END) AS Rodzaj1_Ilosc, 
	SUM(CASE WHEN Rodzaj = 'Ilosc2' THEN Ilosc ELSE 0 END) AS Rodzaj2_Ilosc, 
	SUM(CASE WHEN (Rodzaj = 'Ilosc1' OR Rodzaj = 'Ilosc2') THEN Ilosc ELSE 0 END) AS TOTAL_Ilosc,
	from [NaukaSQL].[dbo].[TabelaTestowa21] 

group by [ID_Towaru], [Dats]
order by [ID_Towaru]

1

To można trochę uprościć:

ELECT
    [ID_Towaru], 
    [Dats], 
    SUM(CASE WHEN Rodzaj = 'Ilosc1' THEN Ilosc ELSE 0 END) AS Rodzaj1_Ilosc, 
    SUM(CASE WHEN Rodzaj = 'Ilosc2' THEN Ilosc ELSE 0 END) AS Rodzaj2_Ilosc, 
    SUM(Ilosc) AS TOTAL_Ilosc,
FROM 
     [NaukaSQL].[dbo].[TabelaTestowa21] 
 WHERE
    RODZAJ IN ('ILOSC1','ILOSC2')
GROUP BY 
    [ID_Towaru], [Dats]
ORDER BY 
   [ID_Towaru]

Musisz powielić, aliasy nie zadziałają

1 użytkowników online, w tym zalogowanych: 0, gości: 1