2016-06-15 12 views
0

2つのテーブルがあり、1つはユーザーのポイントを格納し、もう1つはユーザーが購入した製品を格納します。selectステートメントでSQL Serverのデータ型nvarcharをbigintに変換するエラー

私はユーザーが持っているネットポイントを見つけようとしています。だから私はこれらの2つのクエリを試してみて、他の人から1つを差し引いている間に問題があるようです。

私は違いを見つけるために、SQLクエリを書かれているが、タイプキャスト

スロー
select sum(point) 
from UserPoints 
where Userid = (select id 
       from AspNEtusers 
       where username ='1-V2-4128') 
- 
(
    select sum(o.quantity*o.pointperitem) as Total 
    from AspNetusers as A 
    inner join 
    MyOrders as M 
    inner join OrderedProducts as O 
     on O.Orderid = M.id 
     on M.Userid= A.id 
    where A.username='1-V2-4128' 
) 

エラーに関するエラーがあります:

をBIGINTするデータ型はnvarcharを変換

にエラーが発生しましたそれで試しました

select 
    sum(point) 
from 
    UserPoints 
where 
    Userid = (select id 
       from AspNEtusers 
       where username ='1-V2-4128') 
- convert(
bigint(50), 
(
select sum(o.quantity*o.pointperitem) as Total from AspNetusers as A inner join MyOrders as M inner join OrderedProducts as O 
on O.Orderid = M.id 
on M.Userid= A.id 
where A.username='1-V2-4128') 
) 
スロー

エラーがある

CASTまたはCONVERT:私は答えとしてこれを入れてコメントするポイントを持っていないとして型「bigint型」

+1

'、' point'の種類は何ですか数量、およびポイントパーペitem? –

+2

あなたの質問は意味をなさない。なぜユーザーIDから 'Total'を減算していますか? –

+0

質問には回答するのに十分な情報が含まれていません –

答えて

1

私はこのクエリを勉強した後、T-SQLの弱い知識を発見しました。

OrderedProductsからアイテムあたりの合計ポイントを使用して、UserPointから合計ポイントを減算することは明らかです。

しかし、問題は次のとおりです。それがあるべき

SELECT PointTotal - SELECT PointPerItemTotal -- Which is not the way to subtract in T-SQL 

SELECT (PointTotal - PointPerItemTotal) AS Total -- Correct way for any 
               -- arithmetic operation in T-SQL 

ので、クエリは次のようになります。

DECLARE @UserId NVARCHAR(50) = (SELECT Id -- supposing uniqueidentifier 
           FROM AspNEtusers 
           WHERE UserName = '1-V2-4128') 

SELECT 
    (
     ISNULL((
      SELECT 
       SUM(Point) AS TotalUserPoints -- column should be numberic type  
      FROM 
       UserPoints 
      WHERE 
       Userid = @UserId 
     ), 0) 
     - ISNULL((
      SELECT 
       SUM(o.quantity*o.pointperitem) AS TotalPointPerItem -- column should be numberic type 
      FROM  
       MyOrders AS M 
       INNER JOIN OrderedProducts AS O 
        ON O.Orderid = M.id   
      WHERE  
       M.Userid = @UserId 
     ), 0) 
    ) AS Total 
1

のために指定された無効な属性。 2番目のクエリでは、問題はbigint(50)です。 convert(bigint、expression)を使うだけです。

最初のクエリでは、計算からnvarcharにデータを保存しようとしていることが予想されます。または、計算に使用する列のデータに文字列値が含まれているかどうかを確認します。または、すべての列のwhere句でIsNumericをチェックします。

すなわち

select sum(point) 
from UserPoints 
where Userid = ( select id 
        from AspNEtusers 
        where username ='1-V2-4128') 
     AND ISNUMERIC(point) = 1 

- 

( select sum(o.quantity*o.pointperitem) as Total 
    from AspNetusers as A 
    inner join MyOrders as M 
     on O.Orderid = M.id 
    inner join OrderedProducts as O 
     on M.Userid= A.id 
    where A.username='1-V2-4128' AND ISNUMERIC(o.quantity) = 1 AND ISNUMERIC(o.pointperitem) = 1) 
関連する問題