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