2010-09-05 6 views
2

J'ai une table avec les colonnes suivantes:groupe par qui montre le pourcentage de la date précise

StockID,FundID,DateID,ValueInDate 

Je veux créer une requête GROUP BY qui indique le pourcentage de chaque Fonds du total Valeur en le spécifique Date, sans paramètres.

J'ai le @DateID paramètre uniquement dans cette requête

Toutes les idées?

Répondre

2

Vous pouvez utiliser une table dérivée (sous-requête non corrélée) pour obtenir le total des valeurs pour un @DateID particulier. Prenons l'exemple suivant:

SELECT t.*, (t.ValueInDate/dt.sum_value) * 100 as perc 
FROM your_table t 
JOIN (
      SELECT SUM(ValueInDate) sum_value, DateId 
      FROM  your_table 
      WHERE DateID = @DateID 
      GROUP BY DateId 
     ) dt ON (dt.DateID = t.DateID) 
WHERE t.DateID = @DateID; 

Cas de test:

CREATE TABLE your_table (
    StockID int, FundID int, DateID int, ValueInDate decimal(10,2) 
); 

INSERT INTO your_table VALUES (1, 1, 1, 35); 
INSERT INTO your_table VALUES (2, 1, 1, 75); 
INSERT INTO your_table VALUES (3, 2, 1, 25); 
INSERT INTO your_table VALUES (4, 2, 1, 50); 
INSERT INTO your_table VALUES (5, 3, 2, 15); 
INSERT INTO your_table VALUES (6, 3, 2, 25); 
INSERT INTO your_table VALUES (7, 4, 2, 30); 
INSERT INTO your_table VALUES (8, 4, 2, 60); 

Résultat lorsque @DateID = 1:

+---------+--------+--------+-------------+-----------+ 
| StockID | FundID | DateID | ValueInDate | perc  | 
+---------+--------+--------+-------------+-----------+ 
|  1 |  1 |  1 |  35.00 | 18.918919 | 
|  2 |  1 |  1 |  75.00 | 40.540541 | 
|  3 |  2 |  1 |  25.00 | 13.513514 | 
|  4 |  2 |  1 |  50.00 | 27.027027 | 
+---------+--------+--------+-------------+-----------+ 
4 rows in set (0.00 sec) 
+0

Vous n'avez pas besoin d'un GROUP BY dans la sous-requête? –

+0

@a_horse_with_no_name: Lorsque vous utilisez MySQL non, il n'y a pas besoin. D'autres SGBD peuvent l'exiger. Permettez-moi de l'ajouter juste au cas où ... Fait –

+0

Je pensais que ce serait SQL Server en raison du paramètre @DateID. Je ne savais pas que MySQL avait la même syntaxe de paramètre. –

0

C'est la solution - dans la solution ci-dessous la somme totale n'est pas pour chaque Fonds , c'est pour tous les fonds ensemble. Je le répare un peu, merci pour Daniel Vassallo !!

DECLARE @DATEID int 
SET @DATEID=1 

SELECT t.FundID,t.ValueInDate/CAST(dt.sum_value AS FLOAT) as perc,dt.sum_value 
FROM tbl_Holding_Gemel t JOIN tbl_Funds tf ON t.FundID = tf.FundID 

JOIN (  
      SELECT SUM(ValueInDate) sum_value, FundID 
      FROM  tbl_Holding_Gemel 
      WHERE DateID = @DateID 
      Group By FundID    
     ) dt ON (dt.FundID = t.FundID) 
WHERE t.DateID = @DateID 
+1

Si c'est la solution, vous devriez la marquer comme la réponse. –

Questions connexes