我正在使用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函数,但我知道最好让数据看起来像上面那样。我需要在一个查询中完成所有这些。
任何帮助/建议都将不胜感激。
答案 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;