2010-09-05 56 views
2

我有一个表有以下栏目:集团通过显示在特定日期的百分比

StockID,FundID,DateID,ValueInDate 

我想创建一个GROUP BY查询,显示从总 价值的百分比每个基金具体日期,不带参数。

我有@DateID参数仅在此查询

任何想法?

回答

2

您可能希望使用派生表(不相关的子查询)来获取特定@DateID的值的总和。请看下面的例子:

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; 

测试用例:

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); 

结果时@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

你不需要子查询中的GROUP BY吗? – 2010-09-05 11:11:07

+0

@a_horse_with_no_name:使用MySQL时,没有必要。其他DBMS可能需要它。让我补充一点,以防万一...完成 – 2010-09-05 11:12:17

+0

我认为这将是SQL Server,因为@DateID参数。不知道MySQL有相同的参数语法。 – 2010-09-05 11:13:58

0

这是解决方案 - 在总和下面的解决方案是不是对每个基金,它的所有资金一起。我修复了一点,感谢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

如果这是解决方案,那么您应该将其标记为答案。 – 2010-09-13 00:21:17