Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL:如何在不更改数据的情况下使用UNIONALL组合两个值(money/int)?_Sql Server_Tsql_Union All - Fatal编程技术网

Sql server TSQL:如何在不更改数据的情况下使用UNIONALL组合两个值(money/int)?

Sql server TSQL:如何在不更改数据的情况下使用UNIONALL组合两个值(money/int)?,sql-server,tsql,union-all,Sql Server,Tsql,Union All,我有以下疑问: 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

我有以下疑问:

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值数据显示时不带任何十进制值,就像直接对表运行select时一样。如何将两个查询合并为一个查询以正确显示此数据

Roundvalue,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;

在union中,SQL Server将假定第二个select的数据类型与第一个select的数据类型相同,并且可以在哪里转换它们,请这样做。你必须在它自己的游戏中击败它,并且你自己进行转换


在最后一个选项中,选择一个带有Union的选项,将两种情况下的数据都转换为字符串。在将输出转换为字符串之前,请根据需要对其进行格式化。

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

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

    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

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

圆形货币,4返回一个货币4* convertint返回一个int 基于

13钱 16int 结果列是money4。因此,列中的所有值都将使用money4格式化

你的选择是

convertfloat横跨两个方向-缺点:1.1的值显示为1.1,而不是1.10 convertvarchar-您已经声明不需要它,它将数据类型更改为接收程序 FWIW

Roundvalue,0不执行任何操作

它确实有作用。它将CPU从一个整数值舍入到另一个具有相同值的整数值。顺便说一句,结果类型仍然是int。这与格式无关

参考:


执行存储过程的原始值是:每日余额=4709.000000,值A=1.000000,值B=9.000000我只想从A/B值中删除小数点。如果我将它们都转换为字符串,它们仍将保持十进制值。@Jason-如果转换为字符串,则需要同时转换A/B和balance。否则,根据数据类型优先级,它将进一步将字符串转换为money以匹配第一个联合部分。你读过我的答案了吗?@Richard-我误解了你的意思。回去再试一次后,它成功了。我必须将第一个强制转换添加到int,然后将两个强制转换都添加到varchars。谢谢,不准确。假设第二个select的数据类型与排序的第一个Nothing相同。它基于数据类型优先级而不是Jason,您可以帮助很多人显示您想要的内容。编辑您的问题并添加一个部分,这就是我希望输出的外观。这样就可以省去很多单词下面的两三个答案。但没有建议的答案。OP必须将输出转换为字符串。这是唯一的数据类型,将显示为他想要的。欢迎您的意见。即使我认为你错了。在我看来,你把这当作一个肥皂盒来展示你的“卓越的知识”,它既不卓越也没有帮助。显然,我们会继续不同意,如果你愿意,你可能会做出更多的侮辱。我相信它给你的印象不好。但更重要的是,OP有他的答案。我注意到,按照建议将结果转换为字符串是公认的答案。
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