Увеличение строки в зависимости от значения другого столбца - PullRequest
1 голос
/ 16 марта 2012

У меня есть SQL-запрос ниже, где dtMontno может начинаться с любого месяца, и я добавляю столбец строк вручную, как показано ниже:

SELECT COUNT(*) as count,
       MONTH(TourTbl.DT_Started) as dtMonthno, 
       DATENAME(YYYY, TourTbl.DT_Started) as dtYear,
       row_number() over (order by DATENAME(YYYY, TourTbl.DT_Started) asc,
                                   MONTH(TourTbl.DT_Started) asc ) as Row 
FROM TourTbl 
INNER JOIN BranchTbl ON TourTbl.BranchID = BranchTbl.BranchID 
INNER JOIN AgencyTbl on AgencyTbl.AgencyID = BranchTbl.AgencyID 
WHERE Cancelled = 0  AND 
      (TourTbl.DT_Started >= '2010/03/15' and 
       TourTbl.DT_Started <= '2012/03/15') AND 
      AgencyTbl.AgencyID in ( 245 ) and 
      BranchRODID > 0
group by datename(M, TourTbl.DT_Started), 
         DATENAME(YYYY, TourTbl.DT_Started), 
         MONTH(TourTbl.DT_Started) 
order by dtYear asc, dtMonthno asc 

Теперь мой результат:

  count dtMonthno dtYear    Row
    6      5      2011      1
    8      6      2011      2
    2      7      2011      3
    23     8      2011      4
    126    9      2011      5
    101    10     2011      6
    85     11     2011      7
    92     12     2011      8
    115    1      2012      9
    102    2      2012      10
    48     3      2012      11

Isесть ли способ запустить столбец Row в зависимости от dtMonthno, и приращение на единицу в приведенном выше примере будет начинаться с 5 и заканчиваться на 15?

Спасибо

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Попробуйте изменить происхождение Row на:

row_number() over (order by YEAR(TourTbl.DT_Started) asc,
                            MONTH(TourTbl.DT_Started) asc ) +
min(YEAR(TourTbl.DT_Started)*12+MONTH(TourTbl.DT_Started)-1) OVER () % 12 as Row 
1 голос
/ 16 марта 2012

Вы можете добавить месяц первой даты DT_Started:

SELECT COUNT(*) as count,
       MONTH(TourTbl.DT_Started) as dtMonthno, 
       DATENAME(YYYY, TourTbl.DT_Started) as dtYear,
       row_number() over (order by DATENAME(YYYY, TourTbl.DT_Started) asc,
                                   MONTH(TourTbl.DT_Started) asc ) 
                            + substring(min(DATENAME(YYYY, [TourTbl].DT_Started) + right ('0' + str (MONTH([TourTbl].DT_Started), 2), 2)) over (), 5, 2) - 1 as Row
FROM TourTbl 
INNER JOIN BranchTbl ON TourTbl.BranchID = BranchTbl.BranchID 
INNER JOIN AgencyTbl on AgencyTbl.AgencyID = BranchTbl.AgencyID 
WHERE Cancelled = 0  AND 
      (TourTbl.DT_Started >= '2010/03/15' and 
       TourTbl.DT_Started <= '2012/03/15') AND 
      AgencyTbl.AgencyID in ( 245 ) and 
      BranchRODID > 0
group by datename(M, TourTbl.DT_Started), 
         DATENAME(YYYY, TourTbl.DT_Started), 
         MONTH(TourTbl.DT_Started) 
order by dtYear asc, dtMonthno asc 
0 голосов
/ 16 марта 2012

Я бы усек даты до месяцев и сгруппировал по этим значениям, затем получил бы годы, месяцы и номера строк на основе усеченных дат:

SELECT
  COUNT(*) AS count,
  MONTH(GroupMonth) AS dtMonthno,
  DATENAME(YYYY, GroupMonth) AS dtYear,  /* why do you want year as a string? */
  ROW_NUMBER() OVER (ORDER BY GroupMonth) + MONTH(MIN(GroupMonth) OVER ()) - 1 AS Row
FROM (
  SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, TourTbl.DT_Started), 0) AS GroupMonth
  FROM TourTbl 
  INNER JOIN BranchTbl ON TourTbl.BranchID = BranchTbl.BranchID 
  INNER JOIN AgencyTbl on AgencyTbl.AgencyID = BranchTbl.AgencyID 
  WHERE Cancelled = 0  AND 
        (TourTbl.DT_Started >= '2010/03/15' and 
         TourTbl.DT_Started <= '2012/03/15') AND 
        AgencyTbl.AgencyID in ( 245 ) and 
        BranchRODID > 0
) s
GROUP BY GroupMonth
...