2011-06-29 57 views
1

SQL Server 2008:我有一個表,其中有三列Ship Qty, Size, QtySQL Server存儲過程中的數據相乘

我們需要通過乘以兩個其他列來更新列Qty

目前這是在表中的數據查詢後

Ship Qty   Size    Qty 
2     1*100 EA   NULL 
3     3*20 ML   

預期結果

Ship Qty   Size    Qty 
2     1*100 EA   200 
3     3*20 ML   180 
  1. 分割尺寸到尺寸1(前十)至size2(X背後)(例如1×100 EA => Size1 = 1,SIze2 = 100)
  2. 乘以船舶數量*尺寸1 *尺寸2
  3. 更新字段數量w ith結果數量爲空或空

我不知道,我怎麼能在SQL Server內部做到這一點?我相信一個存儲過程會很有幫助!

回答

3

這是一個嘗試。它做了很多假設,例如直到AFTER Size2之後纔會出現空間,並且*(或者描述中的X(即它是什麼?)的兩側都可以轉換爲INT。

DECLARE @foo TABLE 
    (
     [Ship Qty] INT, 
     Size VARCHAR(32), 
     Qty INT 
    ); 

    INSERT @foo([Ship Qty], Size) 
    SELECT 2, '1*100 EA' 
    UNION SELECT 3, '3*20 ML'; 

    UPDATE @foo SET 
     Qty = [Ship Qty] * CONVERT(INT, LEFT(Size, CHARINDEX('*', Size)-1)) * 
     CONVERT(INT, SUBSTRING(Size, CHARINDEX('*', Size)+1, 
      CHARINDEX(' ', Size)-CHARINDEX('*', Size))) 
    WHERE 
     CHARINDEX('*', Size) > 0 
     AND CHARINDEX(' ', Size) > 0 
     AND Qty IS NULL; 

    SELECT [Ship Qty], Size, Qty FROM @foo; 

我強烈建議您更好地保存這些數據。而不是在一列中存儲「1 * 100 EA」商店1,在一列中存儲100,並且在一列中存儲EA。這將是一個噩夢來維護,而不必強調大小列獲得一致的數據(並且您的公式將針對所有未來的實現)。

我也建議不要使用帶特殊字符的列名(例如空格)。沒有人喜歡在可以避免的時候輸入方括號。

最後,如果你可以強制輸入數據,你應該考慮一個計算列或視圖。事實之後,你不必經常回去更新表格。

+0

是否只更新有NULL或空的Qty? – goofyui

+0

這是第三方數據庫!我在你的帖子中看到了自己的價值觀。所以,我沒有辦法選擇一個獨立的桌子,可能我們可以選擇可變的或可變的 – goofyui

+1

然後你應該告訴第三方他們做錯了。 –

1

如果格式是固定的,你可以使用功能,如patindexsubstring解析大小:

select [Ship Qty] 
,  Size 
,  [Ship Qty] * Size1 * Size2 
from (
     select cast(substring(Size, 1, StarPos-1) as int) as Size1 
     ,  cast(substring(Size, StarPos+1, SpacePos-StarPos-1) as int) 
        as Size2 
     ,  * 
     from (
       select patindex('%*%', Size) as StarPos 
       ,  patindex('% %', Size) as SpacePos 
       ,  * 
       from @t 
       ) as SubQueryAlias1 
     ) as SubQueryAlias2 

Here's a full example at ODATA.

+0

無論是隻更新有NULL還是空的Qty? – goofyui

+0

1X60 EA 1X60 EA 1X30 EA 1X30 EA 1×100 EA 1×100 EA 60X3 ML 實際值這個樣子.. !! Andomar - 您的查詢效果很好 – goofyui

+0

我需要調整它! – goofyui

0

您可以嘗試PARSENAME

-- create simple data, copy from Aaron Bertrand 
DECLARE @foo TABLE 
(
    [Ship Qty] INT, 
    Size VARCHAR(32), 
    Qty INT 
); 

INSERT @foo([Ship Qty], Size) 
SELECT 2, '1*100 EA' 
UNION SELECT 3, '3*20 ML' 
UNION SELECT 3, '1*4.7 ML'; 

-- calcuate Qty  
WITH f AS 
(SELECT [Ship Qty],'[' + REPLACE(REPLACE(Size,'*','].['),' ','].[')+']' as size,Qty 
FROM @foo 
) 
SELECT [Ship Qty],PARSENAME(size,3) as Size1,PARSENAME(size,2) as Size2, 
    1.0*[Ship Qty] * PARSENAME(size,3) * PARSENAME(size,2) AS Qty 
FROM f 
+0

我要去亞倫.. !!亞倫的查詢做得很好!只有問題我面臨的是,我需要更新查詢 – goofyui

0

DECLARE @foo TABLE
( ID INT,
[船舶數量] INT, 尺寸VARCHAR(32), 數量浮法
);

INSERT @foo(ID,[船舶數量],大小)

選擇ID,[船舶數量],[尺寸]從PlacedOrderDetails其中數量爲Null;
UPDATE @foo SET數量= [發貨數量] * CONVERT(INT,LEFT(大小,CHARINDEX('X',Size)-1))* CONVERT(Float,SUBSTRING(Size,CHARINDEX('X',Size )+1,CHARINDEX('',Size)-CHARINDEX('X',Size)))
WHIN CHARINDEX('X',Size)> 0 AND CHARINDEX('',Size)> 0 AND Qty IS NULL;

SELECT Id,[船數量],大小,數量FROM @foo;

- * **** - 該查詢結果有很大 - 問題是,它插入到臨時表 - 我想即時更新它的父表:PlacedOrderDetails

0

我很驚訝沒有人提出計算列。 我同意Aaron正常化數據結構。一列不應該有2個維度和一個類型。這應該是3列。這在數據庫中不應該被允許。

至於計算列 - 這將保存在觸發器。 在SQL Server中,進入表格,修改列數量並將「計算列規格」設置爲所需的功能。 你可以在這裏查看更多關於計算列的信息:http://msdn.microsoft.com/en-us/library/ms191250.aspx