2015-06-11 4 views
1

Мне нужно выбрать последние 12 месяцев. Как вы можете видеть на картинке, май происходит два раза. Но я только хочу, чтобы это произошло один раз. И он должен быть самым новым. Плюс, таблица должна оставаться в этой структуре, с последним месяцем внизу.Как выбрать последние 12 месяцев в sql?

enter image description here

И это запрос:

SELECT Monat2, 
     Monat, 
     CASE WHEN NPLAY_IND = '4P' 
       THEN 'QuadruplePlay' 
      WHEN NPLAY_IND = '3P' 
       THEN 'TriplePlay' 
      WHEN NPLAY_IND = '2P' 
       THEN 'DoublePlay' 
      WHEN NPLAY_IND = '1P' 
       THEN 'SinglePlay' 
     END AS Series, 
     Anzahl as Cnt 
FROM T_Play_n 
where NPLAY_IND != '0P' 
order by Series asc ,Monat 

Это новый запрос

SELECT sub.Monat2,sub.Monat, 
CASE WHEN NPLAY_IND = '4P' 
    THEN 'QuadruplePlay' 
    WHEN NPLAY_IND = '3P' 
    THEN 'TriplePlay' 
    WHEN NPLAY_IND = '2P' 
    THEN 'DoublePlay' 
    WHEN NPLAY_IND = '1P' 
    THEN 'SinglePlay' 
END 
AS Series, Anzahl as Cnt FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Monat2 ORDER BY Monat DESC)rn, 
       Monat2, 
       Monat, 
       Anzahl, 
       NPLAY_IND 
      FROM T_Play_n)sub 
where sub.rn = 1 

Это только показывает месяцы один раз, но это не делает, что для каждого Серии. Так что с каждой игрой должно быть 12 месяцев.

enter image description here

+0

Как насчет «отдельной» или «группы»? – OkieOth

+0

Ваш текущий запрос помог бы – OkieOth

+1

Какой rdbms вы используете? –

ответ

3

В Oracle и SQL-Server вы можете использовать ROW_NUMBER.

name = название месяца и num = месяц номер:

SELECT sub.name, sub.num 
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY num DESC) rn, 
       name, 
       num 
      FROM tab) sub 
    WHERE sub.rn = 1 
ORDER BY num DESC; 
+0

Как это сделать в SQL Server Management Studio? –

+1

@fusionchart_help, в sql-сервере это точно так же –

+1

@Jon Tofte-Hansen, вы забыли псевдоним своего подзапроса ... –

0
WITH R(N) AS 
(
    SELECT 0 
    UNION ALL 
    SELECT N+1 
    FROM R 
    WHERE N < 12 
) 

SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) AS [month] 
FROM R 

The With R(N) является общей таблице Expression.The R является именем результирующего набора (или таблицы), которые вы генерирующие. И N - номер месяца.

0

В SQL Server вы можете сделать это в следующем:

SELECT DateMonth, DateWithMonth -- Specify columns to select 
FROM Tbl -- Source table 
WHERE CAST(CAST(DateWithMonth AS INT) * 100 + 1 AS VARCHAR(20)) >= DATEADD(MONTH, -12,GETDATE()) -- Condition to return data for last 12 months 
GROUP BY DateMonth, DateWithMonth -- Uniqueness 
ORDER BY DateWithMonth -- Sorting to get latest records on the bottom 
0

Так это звучит, как вы хотите, чтобы выбрать строки, которые содержат последнее вхождение месяцев. Нечто подобное должно работать:

select * from [table_name] 
where id in (select max(id) from [table_name] group by [month_column]) 

Последний выбор в скобках будет получить список идентификаторов для последнего вхождения каждого месяца. Если столбец «год + месяц», который вы указали, уже не в порядке убывания, вам может понадобиться не больше этого столбца.

0

Вы можете использовать что-то вроде этого (таблица dbo.Nums содержит Int значения от 0 до 11)

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19991201', CURRENT_TIMESTAMP) + n - 12, '19991201'), 
     DATENAME(MONTH,DateAdd(Month, DATEDIFF(month, '19991201', CURRENT_TIMESTAMP) + n - 12, '19991201')) 
FROM dbo.Nums 
0

я предлагаю для использования имени group by для имени месяца и функции max для числового компонента. Если не числовое значение, используйте to_number().

Смежные вопросы