2015. december 18., péntek

Dinamikus lista készítés SQL


Az alábbi lekérdezésekben megmutatom, hogyan lehet tetszőleges rekordszámú listát generálni az SQL rekurzív lekérdezésével.

Az első lekérdezés egy év, hónap listát generál tetszőlegesen megadott 2 dátum között. Továbbá megadjuk az adott hónap első és utolsó napját, illetve hány napból áll a hónap.
Lehetőség van napi bontást készíteni a lekérdezés második felében található DAY(datevalue) előtti két kötőjel eltávolításával.
Ha az eredményt később máshol szeretnénk felhasználni, betehetjük a lekérdezés futásának eredményét egy állandó, vagy átmeneti táblába (#YearMonthTempTable).

WITH mycte AS
(
  SELECT CAST('2011-01-01' AS DATETIME) DateValue
  UNION ALL
  SELECT  DateValue + 1
  FROM    mycte
  WHERE   DateValue + 1 <= '2030-12-31'
)
SELECT  YEAR(datevalue) ev,
        MONTH(datevalue) honap,
--DAY(datevalue) nap,
        CONVERT(date, min(datevalue)) honap_eleje,
        CONVERT(date, max(datevalue)) honap_vege,
        CONVERT(numeric(9,0), COUNT(datevalue)) honap_napok_db
--INTO #YearMonthTempTable
FROM    mycte
group by YEAR(datevalue), MONTH(datevalue) --,DAY(datevalue)
order by YEAR(datevalue), MONTH(datevalue) --,DAY(datevalue)
OPTION (MAXRECURSION 0)
;

A második, egyszerűbb lekérdezés egy számokból álló listát készít két előre megadott szám között. Az érdekessége ennek az SQL lekérdezésnek, hogy a második oszlopban 0 és 999 közötti véletlen számokat generálunk.

WITH mycte AS
(
  SELECT 1 value
  UNION ALL
  SELECT  value + 1
  FROM    mycte
  WHERE   value + 1 <= 12
)
SELECT  value,
ABS(CHECKSUM(NewId())) % 1000 veletlen_szam
FROM    mycte
order by value
OPTION (MAXRECURSION 0)
;






0 megjegyzés:

Megjegyzés küldése