2017-06-08 6 views
0

私はクライアントのために構築しているジョブ原価計算レポートを持っています。彼らの勘定科目表には小数点以下10桁(1001.55)が含まれています。私は何をしていても、nvarcharを浮動小数点、整数または数値に変換することはできません。私がCOA 5310でフィルタリングしようとしている最後のWhere節を取り出した場合、問題なく実行されます。どのような目立つ明白な問題が私は見落としていますか?どんな助けもありがとう!データ型nvarcharを小数点以下を使用して変換する

--Build Equiptment 
Create Table tmpEquiptment 
(
     [dtmDate] datetime 
     ,[iCustID] int 
     ,[Amount] money 
     ,[COA_Number] DECIMAL(18,2) 
) 
Insert into tmpEquiptment 
     SELECT dtmDate, iCustID, (Register.Debit - Register.Credit), STR(COA.Number) 
     From Register 
     Inner Join COA on Register.AccountID = COA.ID 
     WHERE TranType IN ('Payment', 'Invoice', 'Sale', 'Credit', 'Journal Entry', 'Check', 'Item Receipt', 'Bill', 'Vendor Credit', 'CC Charge', 'CC Credit', 'Deposit', 'Inventory Adjustment', 'Serialized Adjustment') 
     AND Coa.Type in ('Cost of Goods Sold','Expense','Other Expense') 
     AND Isnull(COA.iJobCostingType,0) In (2,3) 
     AND Register.iCustID Is Not Null 
     And Register.dtmDate Between '2016-01-01 00:00:00.000' AND '2018-01-01 00:00:00.000' 
     And STR(COA.Number) = 5310 

- または -

--Build Equiptment 
Create Table tmpEquiptment 
(
     [dtmDate] datetime 
     ,[iCustID] int 
     ,[Amount] money 
     ,[COA_Number] DECIMAL(18,2) 
) 
Insert into tmpEquiptment 
     SELECT dtmDate, iCustID, (Register.Debit - Register.Credit), CONVERT(varchar(10), COA.Number) 
     From Register 
     Inner Join COA on Register.AccountID = COA.ID 
     WHERE TranType IN ('Payment', 'Invoice', 'Sale', 'Credit', 'Journal Entry', 'Check', 'Item Receipt', 'Bill', 'Vendor Credit', 'CC Charge', 'CC Credit', 'Deposit', 'Inventory Adjustment', 'Serialized Adjustment') 
     AND Coa.Type in ('Cost of Goods Sold','Expense','Other Expense') 
     AND Isnull(COA.iJobCostingType,0) In (2,3) 
     AND Register.iCustID Is Not Null 
     And Register.dtmDate Between '2016-01-01 00:00:00.000' AND '2018-01-01 00:00:00.000' 
     And CONVERT(varchar(10), COA.Number) = 5310 

- または -

--Build Equiptment 
Create Table tmpEquiptment 
(
     [dtmDate] datetime 
     ,[iCustID] int 
     ,[Amount] money 
     ,[COA_Number] DECIMAL(18,2) 
) 
Insert into tmpEquiptment 
     SELECT dtmDate, iCustID, (Register.Debit - Register.Credit), CONVERT(DECIMAL(18,2), COA.Number) 
     From Register 
     Inner Join COA on Register.AccountID = COA.ID 
     WHERE TranType IN ('Payment', 'Invoice', 'Sale', 'Credit', 'Journal Entry', 'Check', 'Item Receipt', 'Bill', 'Vendor Credit', 'CC Charge', 'CC Credit', 'Deposit', 'Inventory Adjustment', 'Serialized Adjustment') 
     AND Coa.Type in ('Cost of Goods Sold','Expense','Other Expense') 
     AND Isnull(COA.iJobCostingType,0) In (2,3) 
     AND Register.iCustID Is Not Null 
     And Register.dtmDate Between '2016-01-01 00:00:00.000' AND '2018-01-01 00:00:00.000' 
     And CONVERT(DECIMAL(18,2), COA.Number) = 5310 

- または -

--Build Equiptment 
Create Table tmpEquiptment 
(
     [dtmDate] datetime 
     ,[iCustID] int 
     ,[Amount] money 
     ,[COA_Number] DECIMAL(18,2) 
) 
Insert into tmpEquiptment 
     SELECT dtmDate, iCustID, (Register.Debit - Register.Credit), CAST([COA.Number] AS NVARCHAR(25)) 
     From Register 
     Inner Join COA on Register.AccountID = COA.ID 
     WHERE TranType IN ('Payment', 'Invoice', 'Sale', 'Credit', 'Journal Entry', 'Check', 'Item Receipt', 'Bill', 'Vendor Credit', 'CC Charge', 'CC Credit', 'Deposit', 'Inventory Adjustment', 'Serialized Adjustment') 
     AND Coa.Type in ('Cost of Goods Sold','Expense','Other Expense') 
     AND Isnull(COA.iJobCostingType,0) In (2,3) 
     AND Register.iCustID Is Not Null 
     And Register.dtmDate Between '2016-01-01 00:00:00.000' AND '2018-01-01 00:00:00.000' 
     And CAST([COA.Number] AS NVARCHAR(25)) = 5310 
+0

チャートを小数点として表すことは、悪い考えであると思われます。明らかにそのアイディアを持っていた人は、RDBMSを念頭に置いていませんでした。別々の列に保管したり、少なくともハイフンと組み合わせたりするのはいかがですか?あなたの問題は、10進数値を文字列としてキャストして、それを整数と比較しようとしていることです。 '5310.22'と5310を比較することはできません。左の4桁を入力するか、文字列を比較する必要があります。 –

+0

あなたは 'WHERE COA.Number = '5130''を試しましたか? – BJones

+0

なぜCOA.Numberの型をWHERE句で変更していますか?比較のために列の独自の型を使用します。 –

答えて

1

感謝をBさんの答えの後ろの説明はHです。これは実際にはID10Tエラーだったときの解決策の単純化の問題でした。文字列値(一重引用符)にint(引用符なし)を使用することはできません。

--Build Equiptment 
Create Table tmpEquiptment 
(
     [dtmDate] datetime 
     ,[iCustID] int 
     ,[Amount] money 
     ,[COA_Number] DECIMAL(18,2) 
) 
Insert into tmpEquiptment 
     SELECT dtmDate, iCustID, (Register.Debit - Register.Credit), COA.Number 
     From Register 
     Inner Join COA on Register.AccountID = COA.ID 
     WHERE TranType IN ('Payment', 'Invoice', 'Sale', 'Credit', 'Journal Entry', 'Check', 'Item Receipt', 'Bill', 'Vendor Credit', 'CC Charge', 'CC Credit', 'Deposit', 'Inventory Adjustment', 'Serialized Adjustment') 
     AND Coa.Type in ('Cost of Goods Sold','Expense','Other Expense') 
     AND Isnull(COA.iJobCostingType,0) In (2,3) 
     AND Register.iCustID Is Not Null 
     And Register.dtmDate Between '2016-01-01 00:00:00.000' AND '2018-01-01 00:00:00.000' 
     And COA.Number = '5310' 
0

あなたの問題がありそうなので一部をたまたま行の COA.Numberのsは数値ではありません。あなたは、次のクエリでこれを確認することができます。

select * from COA where ISNUMERIC(COA.Number) <> 1 

今、あなたはそれらの行を修正するか、または逆に、あなたの新しいテーブルを作成している間、あなたはそれらを除外することができます。@Jacobへ

WHERE ISNUMERIC(COA.Number) = 1 
+0

良い君主は、行を "修正"しないでください。これは会計システムです。整数を四捨五入すれば、ビジネス全体が破られます。 COA全体を書き換えようとしている場合を除き、文字列を使用してください。 –

+0

そうですね、整数ではなく数値を意味しています。一定。 –

関連する問題