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

テーブルに対して直接selectを実行する場合のように、値A/値Bのデータを10進値なしで表示したいと思います。このデータを正しく表示するには、2つのクエリを1つに組み合わせるにはどうすればよいですか?

Round(value、0)は何もしません。

データを収集しているsprocを変更することはできませんが、任意の方法で一時テーブルを作成できます。

ありがとう、

ジェイソン

ソリューション:

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は、2番目のselectのデータ型が最初のselectのデータ型と同じであると想定し、変換できる場所でそうします。あなたはそれ自身のゲームでそれを打ち負かす必要がありますそしてあなたはあなた自身の回心をしますか

最終選択(ユニオンのあるもの)では、両方の場合のデータを文字列にマッサージします。文字列に変換する前に、必要に応じて出力をフォーマットします。

于 2011-03-03T22:11:40.547 に答える
0

問題は、整数が10進数の列で表されているため、暗黙的に10進数にキャストされていることです。

値を表示したいだけの場合は、両方を文字列にキャストします。

    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

各SQLServer列は、1つのデータ型のみを持つことができます。

  • round(money、4)はmoney(4)*を返します
  • convert(int)はintを返します

データ型の優先順位に基づく

  • #13。お金
  • #16。int

結果の列はmoney(4)です。したがって、列のすべての値は、money(4)を使用してフォーマットされます。

あなたのオプションは

  1. 両方にまたがるconvert(float)-欠点:1.1の値は1.10ではなく1.1として表示されます
  2. convert(varchar)-これは望ましくないと述べたため、データ型が受信側プログラムに変更されます

FWIW

Round(value、0)は何もしません。

それ何かをします。これは、int値を(同じ値の)別のint値に丸めてCPUを焼き付けます。ちなみに、結果の型は(まだ)「int」です。これはフォーマットとは何の関係もありません。

REF:

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 に答える