2013-01-31 106 views
0

我有一个名为Datatable的表。它有一个名为data的列。无法获得正确的查询

data 
------- 
10  
20  
30 

我需要得到一个列

data 
------- 
10/60 
20/60 
30/60 

我写的查询作为

select data/sum(data) 
    from datatable; 
+3

您是否希望字面上出现“10/60”文本或计算该文本? (〜0.166) –

+0

@Damien_The_Unbeliever我需要计算的值 – user1925921

回答

2

尝试,

select a.data/b.total  -- will result the quotient of 10/60 
from datatable a, 
     (select SUM(data) total from datatable) b 

但如果你想它要连接

select a.data + '/' + b.total -- will result literal string value of 10/60 
from datatable a, 
     (select SUM(data) total from datatable) b 
+1

最后我检查,混合字符串和数字导致尝试将字符串转换为数字,而不是其他方式。 –

+0

@Damien_The_Unbeliever是的,我把它们固定在小提琴链上。 –

-1

我不知道在60值从何而来,但我会做这样的事情:

select data + '/' + sum(data) from datatable group by data 

进行连结,请检查此链接: http://msdn.microsoft.com/en-us/library/aa276862(v=sql.80).aspx

希望这会有所帮助。

+0

如果你按'data'分组,你会得到10/10,20/20,30/30 – Tobsey

+0

我认为你错了。这就是为什么我想知道他想要做什么。这将返回数据(10,20,30)/每个的总和(30次10次,45次20等)。如果他想计算一个值出现的次数,他应该使用count而不是sum。 –

+0

如果按数据分组,那么SUM(data)= data'因此,你的选择会产生10/10/20/20,30/30你将它们转换为varchar,或者它将产生1可用数据表中的每一行 – Tobsey

3

对于SQL Server 2005+,你可以这样做:

SELECT CAST(data AS VARCHAR(10)) + '/' + CAST(SUM(data) OVER() AS VARCHAR(10)) 
FROM Datatable 
+0

+1使用'CAST'和'OVER' :) – bonCodigo

+0

+1这工作,我测试[这里](http://sqlfiddle.com/#!3/a1c0a/10)。 – Kaf

+0

@Kaf您正在查看SQL Server 2012文档。在此之前,'OVER()'内的'ORDER BY'用于聚合函数,比如'SUM'或'COUNT'不被允许。 'ORDER BY'是窗口函数所必需的,如'ROW_NUMBER'或'RANK',其中需要订单 – Lamak

0

这工作的SQL Server 2005或更高版本上:

declare @t table (data int) 
insert into @t (data) values (10),(20),(30) 

select (data * 1.0)/ SUM(data) OVER() from @t 
+0

这应该在SQL Server 2005+上工作(尽管没有表变量和'VALUES'部分) – Lamak

+0

@Lamak - 我不确定,并且没有2005实例。我知道某些聚合窗口函数在5,8和12之间发生了变化。所以我的陈述是真实的,但不是全部包含:-) –