2016-06-15 36 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) 
相關問題