拥有声明后对输出数据进行分组

时间:2018-05-31 17:05:47

标签: sql sql-server grouping having-clause

我正在使用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函数,但我知道最好让数据看起来像上面那样。我需要在一个查询中完成所有这些。

任何帮助/建议都将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以将cte窗口功能一起使用:

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()进行非常短的方式。

答案 1 :(得分:0)

您可以通过派生表进行分组。这将为您提供多个活跃月份的年份。然后,您可以使用子查询从表中获取与派生表中的年份相同的月份。 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

答案 2 :(得分:0)

试试这个:

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;