2010-11-12 96 views
2

我試圖用DECIMAL(5,2)數據類型更新列。但是,SQL Server似乎正在四捨五入,而不是存儲小數位。SQL Server更新不更新小數

例如,其中一個值爲1.53,並且其在表中存儲爲1.00。

這裏的查詢

DECLARE @MaxLike DECIMAL (5,2), @MaxComment DECIMAL (5,2), @MaxFavourite DECIMAL (5,2) 
SET @MaxLike = 1.0*100/(SELECT MAX(z.MaxLike) FROM (SELECT(COUNT(COALESCE(Liked,0))) AS MaxLike FROM Design_LikeRating GROUP BY DesignID) z) 
SET @MaxComment = 1.0*100/(SELECT MAX(z.MaxComment) FROM (SELECT(COUNT(COALESCE(CommentID,0))) AS MaxComment FROM Comment_CommentDetail WHERE IsDeleted = 0 GROUP BY OverallParentGUID) z) 
SET @MaxFavourite = 1.0*100/(SELECT MAX(z.MaxFavourite) FROM (SELECT (COUNT(COALESCE(DesignID,0))) AS MaxFavourite FROM Design_Favourite GROUP BY DesignID) z) 


-- VoteCount and Rate 
DECLARE @table1 TABLE (DesignID INT PRIMARY KEY, Rate DECIMAL(5,2)) 
INSERT INTO @table1 
SELECT DesignID, CAST (Rate AS DECIMAL(5,2)) AS Rate 
FROM 
(
SELECT DesignID, COUNT(COALESCE(Liked,0.0)) AS Rate 
FROM Design_LikeRating WITH (NOLOCK) 
GROUP BY DesignID 
) z 

-- FavCount 
DECLARE @table2 TABLE (DesignID INT PRIMARY KEY, FavCount DECIMAL(5,2)) 
INSERT INTO @table2 
SELECT DesignID, CAST (FavCount AS DECIMAL (5,2)) AS FavCount 
FROM 
(
SELECT DesignID, COUNT(COALESCE(DesignID,0.0)) AS FavCount 
FROM Design_Favourite WITH (NOLOCK) 
GROUP BY DesignID 
) x 

-- CommentCount 
DECLARE @table3 TABLE (DesignGUID UNIQUEIDENTIFIER PRIMARY KEY, CommentCount DECIMAL(5,2)) 
INSERT INTO @table3 
SELECT OverallParentGUID, CAST (CommentCount AS DECIMAL(5,2)) AS CommentCount 
FROM 
(
SELECT OverallParentGUID, COUNT(DISTINCT COALESCE(x.DesignID,0.0)) AS CommentCount 
FROM Comment_CommentDetail z WITH (NOLOCK) 
    INNER JOIN Design_DesignDetail x WITH (NOLOCK) ON x.DesignGUID = z.OverallParentGUID 
WHERE z.IsDeleted = 0 AND x.UserIDInt != z.UserIDInt 
GROUP BY OverallParentGUID 
) y 
; 

WITH CTE AS 
      (
      SELECT (COALESCE((1.0 * z.Rate*@MaxLike),0.0) + COALESCE((1.0 * y.FavCount*@MaxFavourite),0.0) + COALESCE((1.0 * x.CommentCount*@MaxFavourite),0.0)) AS PopularityScore, a.DesignID 
      FROM Design_DesignDetail a 
       LEFT JOIN @table1 AS z ON z.DesignID = a.DesignID 
       LEFT JOIN @table2 AS y ON y.DesignID = a.DesignID 
       LEFT JOIN @table3 AS x ON x.DesignGUID = a.DesignGUID 
      WHERE DesignID > 300000 and DesignID = 444409 
      ) 

UPDATE Design_DesignDetail 
SET  PopularityScore = z.PopularityScore 
FROM Design_DesignDetail a 
     INNER JOIN CTE z on z.DesignID = a.DesignID 

UPDATE 我會停下巧言令色並張貼在這裏整個查詢。正如你所看到的,它得到了所有人的答案,但它仍然沒有工作!

+0

請看我的更新 – gbn 2010-11-12 20:58:58

回答

4

這種表達必須給出一個int或有刻度0的十進制(無十二月地方)

(ISNULL((z.Rate*@MaxLike),0) + ISNULL((y.FavCount*@MaxFavourite),0) + ISNULL((x.CommentCount*@MaxFavourite),0)) 

我猜你需要投浮動每個ISNULL裏面不知道數據類型

請不要使用NOLOCK像

編輯,完整的代碼更新

COUNT聚集將返回INT經過v所以你的小數點(5,2)值可能有xxx.00。

一些評論添加到@ table1的負載

INSERT INTO @table1 
SELECT DesignID, 
-- gbn The CAST changes 2 to 2.00 
CAST (Rate AS DECIMAL(5,2)) AS Rate 
FROM 
(
SELECT DesignID, 
    -- gbn COALESCE does nothing. COUNT gives int and simply counts non-null values 
    COUNT(COALESCE(Liked,0.0)) AS Rate 
FROM Design_LikeRating WITH (NOLOCK) 
GROUP BY DesignID 
) z 

看到這裏Count(*) vs Count(1)我的回答更多的解釋

+0

我知道有人會這麼說!無論如何,當我做一個選擇時,它顯示2位小數? – super9 2010-11-12 20:30:12

+0

@Nai你也可以嘗試在ISNULL((z.Rate*@MaxLike),0.0)的isnull右邊加上0.0,看看會發生什麼。 – 2010-11-12 20:33:31

+0

@Nai:在CTE位選擇?如果這給了1.53,但DesignDetail上的SELECT給出了1.00,那麼你是否有觸發器? *有*數據類型在某處和整數數學不匹配 – gbn 2010-11-12 20:35:14

1

您probablly從某處整數運算的痛苦。

而且,除非您喜歡四捨五入錯誤,否則在進行呼吸時不要使用float。

1

什麼是z.Rate,@MaxLike,y.FavCount,@MaxFavourite和x.CommentCount的類型?

我敢打賭y.FavCount和x.CommentCount是整數。

+0

你說得對,他們是INTS,但我已經將它們換成DECIMAL(5,2) – super9 2010-11-12 20:52:30

0
SELECT ISNULL(1.0 * z.Rate*@MaxLike, 0.0) + 
     ISNULL(1.0 * y.FavCount*@MaxFavourite, 0.0) + 
     ISNULL(1.0 * x.CommentCount*@MaxFavourite, 0.0) AS PopularityScore, a.DesignID 
+0

它會被應用得太晚。損壞(int maths)在「z.Rate*@MaxLike」 – gbn 2010-11-12 20:37:29

+0

正確。更新。 – Stu 2010-11-12 20:43:40

+0

-1你的編輯仍然沒有幫助。 (z.Rate*@MaxLike)等將首先評估:他們在括號內 – gbn 2010-11-12 20:44:27