Динамический запрос SQL в select - PullRequest
0 голосов
/ 31 мая 2018

как записать динамические значения SQL-запроса?

pos_id  start_date  Enddate
1       20140131    20141201
2      20150331     20151201

Результат:

position_id startdate   Enddate Month   Year
1   20140131    20141201    1   2014
1   20140131    20141201    2   2014
1   20140131    20141201    3   2014
1   20140131    20141201    4   2014
1   20140131    20141201    5   2014
1   20140131    20141201    6   2014
1   20140131    20141201    7   2014
1   20140131    20141201    8   2014
1   20140131    20141201    9   2014
1   20140131    20141201    10  2014
1   20140131    20141201    11  2014
1   20140131    20141201    12  2014
2   20150331    20151201    3   2015
2   20150331    20151201    4   2015
2   20150331    20151201    5   2015
2   20150331    20151201    6   2015
2   20150331    20151201    7   2015
2   20150331    20151201    8   2015
2   20150331    20151201    9   2015
2   20150331    20151201    10  2015
2   20150331    20151201    11  2015
2   20150331    20151201    12  2015

select start_date,
cast(SUBSTRING(start_date,5,2)as int),end_date,cast(SUBSTRING(end_date,5,2)as int),
case when 
    cast(SUBSTRING(start_date,5,2)as int) < cast(SUBSTRING(end_date,5,2)as int)
then start_date end
as date_range
from [dbo].[SRC_TEST_DATE]

Я могу сравнивать значения, но как получить динамические значения.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018
SELECT Position_ID, MONTH(DATEADD(MONTH, X.NUMBER, BEGDA)) PERIOD, 
YEAR(DATEADD(MONTH, X.NUMBER, BEGDA)) YEAR, BEGDA, ENdda 
from SRC_IN_TEST 
INNER JOIN 
MASTER.DBO.SPT_VALUES X 
ON 1 = 1 
WHERE X.TYPE = 'P' AND
X.NUMBER <= DATEDIFF(MONTH, CONVERT(DATE,LEFT(BEGDA,8)), 
CONVERT(DATE,LEFT(REPLACE(endda,9999,2024),8))
0 голосов
/ 31 мая 2018

Рекурсивный подзапрос - это один простой метод:

with cte as (
      select pos_id, startdate, enddate, startdate as yyyymm
      from t
      union all
      select pos_id, startdate, enddate, dateadd(month, 1, startdate)
      from t
      where yyyymm < enddate
     )
select pos_id, startdate, enddate, month(yyyymm), year(yyyymm)
from cte
order by pos_id, start_date, yyyymm;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...