2016-04-18 1 views
9

J'ai mes données dans le tableau que:colonne calculée dans SQL Server

id Author_ID Research_Area  Category_ID Paper_Count Paper_Year Rank 
--------------------------------------------------------------------------------- 
1 677   feature extraction 8   1    2005   1 
2 677   image annotation 11   1    2005   2 
3 677   probabilistic model 12   1    2005   3 
4 677   semantic   19   1    2007   1 
5 677   feature extraction 8   1    2009   1 
6 677   image annotation 11   1    2011   1 
7 677   semantic   19   1    2012   1 
8 677   video sequence  5   2    2013   1 
9 1359  adversary model  1   2    2005   1 
10 1359  ensemble method  14   2    2005   2 
11 1359  image represent  11   2    2005   3 
12 1359  adversary model  1   7    2006   1 
13 1359  concurrency control 17   5    2006   2 
14 1359  information system 12   2    2006   3 
15 ...   
16 ... 

Alors que je veux avoir une sortie de requête comme:

id Author_ID Category_ID Paper_Count Category_Prob Paper_Year Rank 
--------------------------------------------------------------------------------- 
1 677   8   1    0.333   2005   1 
2 677   11   1    0.333   2005   2 
3 677   12   1    0.333   2005   3 
4 677   19   1    1.0    2007   1 
5 677   8   1    1.0    2009   1 
6 677   11   1    1.0    2011   1 
7 677   19   1    1.0    2012   1 
8 677   5   2    1.0    2013   1 
9 1359  1   2    0.333   2005   1 
10 1359  14   2    0.333   2005   2 
11 1359  11   2    0.333   2005   3 
12 1359  1   7    0.5    2006   1 
13 1359  17   5    0.357   2006   2 
14 1359  12   2    0.142   2006   3 
15 ...   
16 ... 

Alors que Category_Prob est une colonne calculée qui est calculée en deux étapes comme:

Étape d'abord, nous devons avoir un SUM de Paper_Count dans eac h Paper_Year par exemple à savoir Paper_Year = 2005 et Author_ID = 677, le SUM(Paper_Count) = 3

Deuxième étape, puis pour chaque Category_ID, nous devons diviser Paper_Count avec une valeur de SUM(Paper_Count) dans ce Paper_Year qui sera 1/3-à-dire 0.333 et ainsi de suite ...

De plus, je l'ai essayé cette requête:

SELECT 
    Author_ID, Abstract_Category, Paper_Count, 
    [Category_Prob] = Paper_Count/SUM(Paper_Count), 
    Paper_Year, Rank 
FROM 
    Author_Areas 
GROUP BY 
    Author_ID, Abstract_Category, Paper_Year, Paper_Count, Rank 
ORDER BY 
    Author_ID, Paper_Year 

Mais il retourne juste 1 dans la colonne Category_Prob pour toutes les lignes de la table.

Aidez s'il vous plaît!

Répondre

6

Le problème avec votre requête est que vous n'êtes pas le regroupement par Paper_Year, mais aussi par Author_ID, Abstract_Category, Paper_Count, Rank. Par conséquent SUM(Paper_Count) est égal à Paper_Count pour chaque groupe.

Vous pouvez utiliser SUM OVER pour cela:

SELECT  id, Author_ID, Abstract_Category [Category_ID], 
      Paper_Count, 
      Paper_Count * 1.0/SUM(Paper_Count) 
      OVER (PARTITION BY Author_ID, Paper_Year) AS [Category_Prob], 
      Paper_Year, Rank 
FROM  Author_Areas 
ORDER BY Author_ID, Paper_Year 

Note: Vous devez multiplier par 1.0 afin d'éviter la division entière. Note 2: Vous devez peut-être ajouter le champ Author_ID dans la clause PARTITION BY, si vous avez réellement besoin de regrouper par auteur, année.

+0

@ Giorgos - La requête a été exécutée avec succès, mais les valeurs dans la colonne 'calculate_column' ne sont pas aussi désirées. – maliks

+0

@Bridge Je ne pense pas. La clause 'SUM' avec' OVER' est disponible à partir de SQL Server 2005 (ce qui n'est pas sûr à 100%). Sql Server 2012 a ajouté 'ORDER BY' dans la clause' OVER' afin de calculer les totaux cumulés. –

+0

@GiorgosBetsos Vous avez raison, mon erreur – Bridge

0

Je soupçonne (veuillez confirmer) que le type de données de tous les champs concernés est integers. Lorsque vous calculez avec int le type de retour est également int. Vous devez convert les champs à decimal avant le calcul.

SELECT Author_ID, Abstract_Category, Paper_Count, 
[Category_Prob] = convert(decimal(10,3), Paper_Count)/convert(decimal(10, 3), SUM(Paper_Count)), 
Paper_Year, Rank 
FROM Author_Areas 
GROUP BY Author_ID, Abstract_Category, Paper_Year, Paper_Count, Rank 
ORDER BY Author_ID, Paper_Year