Группировка выходных данных после заявления - PullRequest
0 голосов
/ 31 мая 2018

Я использую Microsoft SQL Server 2012 и застрял на кодировке SQL.

У меня есть следующие столбцы Год, Месяц и Актив, и вот несколько небольших примеров данных ниже:

Year Month Active
2005  Feb     Y
2005  May     Y
2006  Nov     Y
2007  Jul     Y
2008  Jan     Y
2008  Mar     Y

Я хочу вернуть годы, которые имеют 2 или более «активных» месяца (HAVING Active> 2) в течение года.Итак, из этих данных я хочу вернуть годы: 2005 и 2008.

Я хотел, чтобы данные читались так:

Year   Month
2005  Feb, May
2008  Jan, Mar

Как мне поступить?Я знаю, как группировать и использовать функцию Count, но я знаю, что лучше сделать так, чтобы данные выглядели выше.И мне нужно сделать все это в 1 запросе.

Любая помощь / предложения будут оценены.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете сделать свою группу, имея и имея в производной таблице.Это даст вам годы, которые имеют несколько активных месяцев.Затем вы можете использовать подзапрос, чтобы получить месяцы из вашей таблицы, которые имеют тот же год, что и годы в вашей производной таблице.FOR XML PATH ('') преобразует значения в строку, разделенную запятыми, а STUFF просто удалит начальную запятую и пробел.

select  Year, 
        stuff((select ', ' + Month
               from     Table1 t1
               where    t1.Year = dt.Year 
               for xml path(''))
               ,1,2,'') as Month
From    (
            select      Year 
            from        Table1 
            where       Active = 'Y'
            group by    Year
            having      count(*) > 1
        ) dt
0 голосов
/ 01 июня 2018

попробуйте это:

select Year,
       stuff( (select ','+Month
               from YourTable c1
               where c.year = c1.year 
               for xml path('')
              ), 1, 1, ''
            ) as Month
from YourTable c
group by Year
Having SUM(CASE WHEN Active='Y' THEN 1 Else 0 END)>=2; 
0 голосов
/ 31 мая 2018

Вы можете использовать cte с функцией window :

with cte as ( 
      select *
      from (select *, count(*) over (partition by year) c
            from table 
           ) t
      where c > 1
)
select Year,
       stuff( (select ','+Month
               from cte c1
               where c.year = c1.year 
               for xml path('')
              ), 1, 1, ''
            ) as Month
from cte c
group by Year;   

В предыдущем запросе используется метод xml с помощью функции stuff() для захвата строк в одно поле,Однако, если у вас есть какой-либо план по обновлению SQL Server, у вас будет очень короткий путь через функцию STRING_AGG() вместо xml + stuff().

...