La sélection de données dans plusieurs plages DATE (année) dans des colonnes nommées SQL Server

Je dois sélectionner datatables d'une table SQL Sever pour plusieurs plages de dates

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

J'ai utilisé cette requête pour get des données sans plages de 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 

Cela donne la sortie comme dans l'image à savoir

entrez la description de l'image ici

Maintenant, pour chaque plage DATE utilisant la clause WHERE , je dois afficher datatables dans la colonne correspondante pour les plages DATE. Alors que j'ai utilisé cette requête à savoir

 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 

Et cette requête génère ceci:

entrez la description de l'image ici

mais j'ai besoin de research_area_category_id value sous (1990-1994, 1992-1996, 1994-1998 ….. etc.) ces colonnes. Par exemple, dans la colonne 1990 - 1994 , il devrait afficher research_area_category_id respectif research_area_category_id c'est-à-dire 1 , 1 et 32 au lieu de Counting ie 1 , 1 et 1 , de même qu'il devrait afficher 33 au lieu de 2 dans la colonne 1998 - 2002 et vice versa.

S'il vous plaît aider et merci d'avance.

Tab Alleman a déjà fait allusion à la meilleure approche ici dans les commentaires, mais je vais être insolent et l'append comme une réponse.

Vous êtes certain que vous souhaitez afficher les valeurs de la colonne research_area_category_id dans vos colonnes de dates pivotées. Par conséquent, la première étape consiste à définir research_area_category_id la sortie de chaque instruction CASE , plutôt qu'un entier 1 :

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

Si vous exécutiez votre code avec juste ce changement, vous findiez que la fonction SUM fait que la sortie est multiple de la valeur de research_area_category_id . Par exemple, la première ligne pour 1998 - 2002 aurait la valeur 66 (deux fois 33).

Cela nous indique que vous ne voulez plus utiliser la fonction SUM . Cependant, vous voulez toujours agréger (regrouper) datatables sur toutes les lignes avec des valeurs p_year différentes, donc vous devez utiliser une sorte de fonction d'agrégat à la place. Si vous ne le faites pas, SQL Server p_year une erreur car vous ne regroupez pas par p_year .

La fonction d'agrégation la plus simple à utiliser dans ce cas est MAX , qui prend la valeur la plus élevée de l'set des lignes groupées en une seule. La documentation officielle a quelques exemples simples.

Cela fonctionnera uniquement dans votre cas, à condition que toutes les valeurs de research_area_category_id soient positives (supérieures au 0 par défaut de l'instruction CASE ), ce qui semble être le cas.

La combinaison de la modification aux instructions CASE avec une modification de SUM en MAX donne la version suivante de votre requête:

 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 

Dans le cas où vous êtes intéressé, j'ai mocké quelques lignes de données comme la vôtre dans ce violon SQL pour tester cette requête avant de répondre. (Je p_year les valeurs de p_year mais ils prouvent le principe, à less que j'aie mal compris votre condition.)