1

我有以下查询:

create table #Result (Reward varchar(40), Value MONEY);

insert #Result exec GetCurrentCycleQualifierStatusByAccountId @AccountId=76011;

with cteFirstResults as
(select Reward, round(Value,2) as Value from #Result where Reward like '%Balance%'), 
cteSecondResults as
(select Reward, convert(INTEGER, Value) as Value from #Result where Reward NOT like    '%Balance%')

select * from cteFirstResults 
UNION ALL
select * from cteSecondResults;

drop table #Result;

当针对每个“cte”表单独运行 select * 时,我得到了我想要的结果。
但是当一起运行时,我得到类似的东西:

Reward          Value
------          -----
Daily Balance   4709.00
Value A         1.00
Value B         9.00

我希望值 A/值 B 数据显示没有任何十进制值,就像直接对表运行选择时那样。如何将这两个查询合并为一个以正确显示此数据?

Round(value,0) 什么都不做。

我无法更改从中收集数据的存储过程,但我可以以任何我喜欢的方式制作临时表。

谢谢,

杰森

解决方案:

create table #Result (Reward varchar(40), Value MONEY);
insert #Result exec GetCurrentCycleQualifierStatusByAccountId @AccountId=76011;
With cteFirstResults as
(
Select Reward, Value
From #Result 
Where Reward like '%Balance%'
)
,  cteSecondResults as
(
Select Reward, cast(Value as int) as Value
From #Result 
Where Reward Not like '%Balance%'
)
Select Reward, Cast( Value As varchar(max)) As Value
From cteFirstResults 
Union All
Select Reward, Cast( value As varchar(max)) as Value
From cteSecondResults;
drop table #Result;
4

3 回答 3

0

在联合中,SQL Server 将假定第二个选择的数据类型与第一个相同,并且可以在其中转换它们,这样做。你将不得不在它自己的游戏中击败它并且你自己的转换

在最后的选择(带有联合的那个)中,两种情况下的数据都是一个字符串。在将输出转换为字符串之前,根据需要格式化输出。

于 2011-03-03T22:11:40.547 回答
0

问题是整数被隐式转换为十进制,因为它们在十进制列中表示。

如果您只想显示值,请将它们都转换为字符串。

    CREATE TABLE #test
(
    test decimal(9,2)
)

CREATE TABLE #test2
(
test int
)

INSERT INTO #test (test)
SELECT 1.25 UNION ALL
SELECT 172813.99

INSERT INTO #test2 (test)
SELECT 134 UNION ALL
SELECT 41

SELECT CAST(test as  varchar(max)) FROM #Test
UNION ALL
SELECT CAST(test as  varchar(max)) FROM #Test2

结果:

1.25
172813.99
134
41
于 2011-03-03T22:18:50.810 回答
0

每个 Sql Server 列只能有 1 种数据类型。

  • round(money,4) 返回钱(4)*
  • convert(int) 返回一个 int

基于数据类型优先级

  • #13。钱
  • #16。整数

结果列是money(4)。因此,列中的所有值都将使用 money(4) 进行格式化。

你的选择是

  1. 两者之间的转换(浮动) - 缺点:1.1 的值显示为 1.1,而不是 1.10
  2. convert(varchar) - 你已经声明你不想要这个,它将数据类型更改为接收程序

FWIW

Round(value,0) 什么都不做。

确实做某事。它将 CPU 将一个 int 值舍入为另一个 int 值(具有相同的值)。顺便说一句,结果类型(仍然)是“int”。这与格式无关。

参考:

declare @m money
set @m = 12.3233
select SQL_VARIANT_PROPERTY(round(@m,2), 'basetype')   -- money
select SQL_VARIANT_PROPERTY(round(@m,2), 'precision')  -- 19
select SQL_VARIANT_PROPERTY(round(@m,2), 'scale')      -- 4
于 2011-03-03T22:20:37.473 回答