2015-09-15 36 views
2

我不得不选择从SQL Sever的表中多个日期范围即数据选择数据范围为指定的列的SQL Server

1990-1994, 1992-1996, 1994-1998, 1996-2000, 1998-2002, 2000-2004, 
2002-2006, 2004-2008, 2006-2010, 2008-2012, 2010-2014 

我已经使用这个查询来获取无DATE范围数据即

SELECT 
    aid, research_area_category_id, 
    CAST(research_area as VARCHAR(100)) [research_area], 
    COUNT(*) [Counting] 
FROM 
    sub_aminer_paper 
GROUP BY 
    CAST(research_area as VARCHAR(100)), aid, research_area_category_id 
HAVING 
    aid = 12403 
ORDER BY 
    Counting DESC 

这给出输出作为图像即

enter image description here

现在对于使用WHERE子句的每个DATE范围,我必须在DATE范围的相应列中显示数据。虽然我已经使用这个查询即

SELECT 
    aid, research_area_category_id, 
    [research_area] = CAST(research_area as VARCHAR(100)), 
    [Counting] = COUNT(*), 
    [1990 - 1994] = SUM(CASE WHEN p_year BETWEEN 1990 AND 1994 THEN 1 ELSE 0 END), 
    [1992 - 1996] = SUM(CASE WHEN p_year BETWEEN 1992 AND 1996 THEN 1 ELSE 0 END), 
    [1994 - 1998] = SUM(CASE WHEN p_year BETWEEN 1994 AND 1998 THEN 1 ELSE 0 END), 
    [1996 - 2000] = SUM(CASE WHEN p_year BETWEEN 1996 AND 2000 THEN 1 ELSE 0 END), 
    [1998 - 2002] = SUM(CASE WHEN p_year BETWEEN 1998 AND 2002 THEN 1 ELSE 0 END), 
    [2000 - 2004] = SUM(CASE WHEN p_year BETWEEN 2000 AND 2004 THEN 1 ELSE 0 END), 
    [2002 - 2006] = SUM(CASE WHEN p_year BETWEEN 2002 AND 2006 THEN 1 ELSE 0 END), 
    [2004 - 2008] = SUM(CASE WHEN p_year BETWEEN 2004 AND 2008 THEN 1 ELSE 0 END), 
    [2006 - 2010] = SUM(CASE WHEN p_year BETWEEN 2006 AND 2010 THEN 1 ELSE 0 END), 
    [2008 - 2012] = SUM(CASE WHEN p_year BETWEEN 2008 AND 2012 THEN 1 ELSE 0 END), 
    [2010 - 2014] = SUM(CASE WHEN p_year BETWEEN 2010 AND 2014 THEN 1 ELSE 0 END) 
FROM 
    sub_aminer_paper 
WHERE 
    aid = 2937 
    AND p_year BETWEEN 1990 AND 2014    
GROUP BY 
    aid, CAST(research_area AS VARCHAR(100)), research_area_category_id 
ORDER BY aid ASC, Counting DESC 

而这个查询输出这样的:

enter image description here

,但我需要下(1990- 1994年,1992- 1996年,1994- 1998年research_area_category_id值...这些专栏。例如。在1990 - 1994柱,它应该显示各research_area_category_id1132代替Counting111,类似地它应该显示33代替21998 - 2002柱,反之亦然。

请帮助和提前致谢。

+0

你想添加您的日期范围为列? –

+0

@FelixPamittan绝对是 – maliks

+1

'HAVING'只能用于**集合**,例如'COUNT','MAX','AVG'等等 - 而不是像这样基本的表达方式 - 使用'WHERE援助= 12403'代替 –

回答

1

标签Alleman已经提到在评论中这里最好的办法,但我要厚脸皮,并将其添加作为一个答案。

你是清楚的,你想在你的转动日期列显示来自research_area_category_id列值。因此,第一步这里是让research_area_category_id每个CASE语句的输出,而不是一个整数1

CASE WHEN p_year BETWEEN 1990 AND 1994 THEN research_area_category_id ELSE 0 END 

如果你只是这种变化跑出你的代码,你会发现SUM功能使输出为倍数值为research_area_category_id。例如,1998 - 2002的第一行将具有值66(两倍33)。

所以这告诉我们,你不希望使用SUM功能了。但是,您仍然希望在具有不同的p_year值的所有行上聚合(分组)数据,因此您必须改用某种类型的聚合函数。如果你没有,SQL Server会抛出一个错误,因为你没有按p_year分组。

最简单的集合函数在这种情况下使用的是MAX,其从组行取最高值被分组成一个。 official documentation有一些简单的例子。

这只适用于您的情况,前提是research_area_category_id的所有值都是正数(大于CASE语句默认设置的0),它们似乎是。

结合变向CASE语句从SUMMAX的变化给你的查询以下版本:

SELECT 
aid, research_area_category_id, 
[research_area] = CAST(research_area as VARCHAR(100)), 
[Counting] = COUNT(*), 
[1990 - 1994] = MAX(CASE WHEN p_year BETWEEN 1990 AND 1994 THEN research_area_category_id ELSE 0 END), 
[1992 - 1996] = MAX(CASE WHEN p_year BETWEEN 1992 AND 1996 THEN research_area_category_id ELSE 0 END), 
[1994 - 1998] = MAX(CASE WHEN p_year BETWEEN 1994 AND 1998 THEN research_area_category_id ELSE 0 END), 
[1996 - 2000] = MAX(CASE WHEN p_year BETWEEN 1996 AND 2000 THEN research_area_category_id ELSE 0 END), 
[1998 - 2002] = MAX(CASE WHEN p_year BETWEEN 1998 AND 2002 THEN research_area_category_id ELSE 0 END), 
[2000 - 2004] = MAX(CASE WHEN p_year BETWEEN 2000 AND 2004 THEN research_area_category_id ELSE 0 END), 
[2002 - 2006] = MAX(CASE WHEN p_year BETWEEN 2002 AND 2006 THEN research_area_category_id ELSE 0 END), 
[2004 - 2008] = MAX(CASE WHEN p_year BETWEEN 2004 AND 2008 THEN research_area_category_id ELSE 0 END), 
[2006 - 2010] = MAX(CASE WHEN p_year BETWEEN 2006 AND 2010 THEN research_area_category_id ELSE 0 END), 
[2008 - 2012] = MAX(CASE WHEN p_year BETWEEN 2008 AND 2012 THEN research_area_category_id ELSE 0 END), 
[2010 - 2014] = MAX(CASE WHEN p_year BETWEEN 2010 AND 2014 THEN research_area_category_id ELSE 0 END) 
FROM 
    sub_aminer_paper 
WHERE 
    aid = 2937 
    AND p_year BETWEEN 1990 AND 2014    
GROUP BY 
    aid, CAST(research_area AS VARCHAR(100)), research_area_category_id 
ORDER BY aid ASC, Counting DESC 

如果你有兴趣,我嘲笑了像你这样的数据的几行在this SQL fiddle之前在回答之前测试此查询。 (我猜在p_year值,但他们证明的原则,除非我误解你的要求。)

+0

顺便说一句,你可能要探讨[PIVOT(https://technet.microsoft.com/en-us/library/ms177410(V = SQL.105)的.aspx)在Transact-SQL的功能,因为这是另一种以您所追求的风格显示结果的方法。不管是好还是坏,都取决于你的用例。 –

+0

@ philosophicles - 非常感谢,它的所有功能都改变了SUM到MAX,并且在THEN语句中需要列替换 – maliks