2016-06-15 105 views
0

我有2个表,一个存储用户点,另一个存储用户已购买的产品。在SELECT语句中将SQL Server中的数据类型nvarchar转换为bigint时出错

我一直在试图找出用户拥有的网点。所以,从另一个中扣除一个我试过这两个查询都似乎有问题。

我已经写了一个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' 
) 

错误抛出:

错误转换数据类型为nvarchar为bigint

然后我试了

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'的','数量“和”pointperitem“? –

+2

你的查询毫无意义。你为什么从用户ID中减去'Total'? –

+0

问题没有包括足够的信息来回答 –

回答

1

我发现T-SQL的薄弱知识研究这个查询之后。

从查询中可以明显看出,您愿意从UserPoint中减去OrderedProducts中每个项目的总点数。

但问题是:

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

指定为我没有点评论把这个作为答案无效属性。对于第二个查询,问题是使用bigint(50)。你应该简单地使用convert(bigint,表达式)。

对于第一个查询,我猜你试图将数据从计算中保存到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) 
相关问题