我正在使用sql server 2005,我正在从特定的表中计算
SELECT count(StudentIdReference) as studentCount FROM StudentTable
现在这个select语句返回结果像2或78或790.但是将来它会迅速增长并且在UI上我没有足够的空间来显示像1000000这样的数字。 我希望在3位数后,我会得到像1K或1.6K这样的数字,正如我们在stackoverflow上看到的那样。
答案 0 :(得分:1)
这在您的应用程序的表示层中更容易完成。
你可以写一个用户函数并做这样的事情......
CREATE FUNCTION prettyPrint
(@number int)
RETURNS varchar(30)
AS
BEGIN
declare @return varchar(30)
set @return = cast(@number as varchar(3))
if @number > 1000
set @return = ''+ cast((@number/1000) as varchar(3)) + '.' + cast((@number % 1000)/100 as varchar(3)) +'K'
-- here must be more 'exceptions' or change all this about the magic number 1000
return @return
end
select dbo.prettyPrint(1500)
SELECT prettyPrint(count(StudentIdReference)) as studentCount FROM StudentTable
答案 1 :(得分:0)
您需要编写自己的逻辑来显示此类文本。没有内置方法。
答案 2 :(得分:0)
我会从SQL Server返回COUNT,并将格式保留到UI。这是因为:
1)通常更容易/高效地在SQL之外进行格式化/字符串操作
2)使用相同查询的代码中的不同位置可能希望以不同的方式使用数据(可能不是现在,但可以在将来执行)因此返回计数as-is为您提供了灵活性 - 即不需要1个版本将计数作为INT返回,另一个返回与格式化的VARCHAR相同的
你可以在SQL中执行它,但总的来说,我相信将其推入UI,因为它是一种显示/格式化行为。
答案 3 :(得分:0)
正如其他人所说,你应该在你的演示层而不是在数据库中这样做,但是,这将为你做到:
Declare @StudentCount int,
@StudentCountFormatted varchar(10)
Select @StudentCount = Count(StudentIdReference) as studentCount FROM StudentTable
If @StudentCount > 999
Begin
Select @StudentCountFormatted = Convert(Varchar(10), Convert(numeric(19,1), (@StudentCount/ 1000.00))) + 'K'
End
Else
Begin
Select @StudentCountFormatted = @StudentCount
End
Select @StudentCountFormatted
答案 4 :(得分:0)
你可以尝试这样的事情
SELECT
CASE
WHEN len(cast(count(*) as varchar(10)))< 4 then cast(count(*) as varchar(10))
WHEN len(cast(count(*) as varchar(10)))> 4 and len(cast(count(*)as varchar(10)))< 7
THEN cast(cast(count(*) / 1000.0 as decimal(10,1)) as varchar(10)) + 'k'
ELSE cast(cast(count(*) / 1000000.0 as decimal(10,1)) as varchar(10)) + 'm'
END StudentCount
FROM StudentTable