2014-08-31 55 views
0

比方说,我有以下SQL查询来划分跨加总在SQL Server行值

Col1   Col2 
1   A  
1   A 
1   A 
1   B 
1   B 
1   B 
1   B 
2   A 
2   A 
2   B 
3   A 
3   A 
3   A 
3   A 
3   A 
3   A 

什么,我需要做的是写一个决定的记录数为Col1中的每个组合查询和Col2并除以1,然后将该值赋给一个新列(Col3),但是在某些情况下,我还需要更新记录,所以在总结新列时,它总是为每个Col1和Col2的组合添加一个记录。

所以,在第一步骤中我最终会与

Col1   Col2   NumberofRows 
1   A    3 
1   B    4 
2   A    2 
2   B    1 
3   A    6 

其中求和COL3当其中Col1中= 1和col2上= A我们最终由1分割时产生

Col1   Col2   Col3 
1   A   0.33 
1   A   0.33 
1   A   0.33 
1   B   0.25 
1   B   0.25 
1   B   0.25 
1   B   0.25 
2   A   0.5 
2   A   0.5 
2   B   1 
3   A   0.17 
3   A   0.17 
3   A   0.17 
3   A   0.17 
3   A   0.17 
3   A   0.17 

然而与0.99而不是1,原因很明显。类似地,求和Col3,其中Col1 = 3并且Col2 = A,我们以1.02结束。

我该怎么做?

回答

0

SQL Server只能存储确切的数字,如果它们可以表示为整数除以十的倍数。由于三分之一不能用这种方式表达,SQL Server不能存储三分之一的精度。

更好的选择是存储行数。行数是整数,SQL Server可以存储它们而不会损失精度。它们将与行总数完全相加。如果显示该行,则可以显示1/rc。您显示的内容永远不会加1,但这是以十进制形式显示数字的限制。

如果它的好来显示数字为分数,你可以:

select '1/' + cast(rc as varchar(20)) 
0

我尝试使用CTE。 请检查下面我的做法:

;WITH c1 
AS 
(SELECT col1, col2, count(*) as Cnt 
    FROM test 
    GROUP BY col1, col2 
), 
c2 
AS 
(SELECT t.col1, t.col2, cast(cast(1 as decimal(5, 2))/grpCount.Cnt as decimal(5, 2)) 
    AS Cnt, 1%grpCount.Cnt AS roundedCount 
    FROM test t 
    JOIN (SELECT * FROM c1) AS grpCount 
ON grpCount.col1 = t.col1 AND grpCount.col2 = t.col2 
) 
SELECT * FROM c2; 

SQL小提琴: - http://sqlfiddle.com/#!6/fe268/7

0

你需要确保SQL使用的中间值作为花车,但随后转换为十进制2 DP当显示

SQL Fiddle

MS SQL Server 2012的架构设置

CREATE TABLE tableA 
(
    Col1 int, 
    Col2 VARCHAR(1) 
) 

INSERT INTO tableA 
VALUES 
    (1,'A'), 
    (1,'A'), 
    (1,'A'), 
    (1,'B'), 
    (1,'B'), 
    (1,'B'), 
    (1,'B'), 
    (2,'A'), 
    (2,'A'), 
    (2,'B'), 
    (3,'A'), 
    (3,'A'), 
    (3,'A'), 
    (3,'A'), 
    (3,'A'), 
    (3,'A') 

查询1

;WITH cnt 
AS 
(
    SELECT Col1, Col2, 1.0/COUNT(*) cnt 
    FROM tableA 
    GROUP BY Col1, Col2 
) 
SELECT A.Col1, A.Col2, CAST(SUM(cnt) AS decimal(4,2)) 
FROM tableA A 
INNER JOIN cnt 
    ON A.Col1 = cnt.Col1 AND A.Col2 = cnt.Col2 
GROUP BY A.Col1, A.Col2 

Results

| COL1 | COL2 | COLUMN_2 | 
|------|------|----------| 
| 1 | A |  1 | 
| 1 | B |  1 | 
| 2 | A |  1 | 
| 2 | B |  1 | 
| 3 | A |  1 |