2011-06-29 42 views
1

SQL Server 2008:3列のテーブルShip Qty, Size, Qtyがあります。SQL Serverストアドプロシージャ内のデータの乗算

他の2つの列を掛けて列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(前X)と(Xの後ろ)SIZE2(例えば1X100に
  1. スプリットサイズEA => Size1 = 1、SIZE2 = 100)
  2. 倍数倍サイズ1サイズ2
  3. 更新フィールド数量w結果がqtyがnullまたは空の場合

私は考えていませんが、どのようにSQL Server内で実行できますか?私はストアドプロシージャが役立つと確信しています!

答えて

3

一回の試みです。それは多くの仮定を作ります。スペース2は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または空の列数を更新するかどうか – goofyui

+0

1X60 EA 1X60 EA 1X30 EA 1X30 EA 1X100 EA 1X100 EA 60X3 ML 実際の値は、次のようになり..! Andomar - あなたのお問い合わせは素晴らしい作品 – goofyui

+0

私はそれを調整する必要があります! – goofyui

0

あなたは
( のId int型、
[船数量] INT、 サイズVARCHAR(32)、 数量フロート
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を試すこと。

数量がNullであるPlacedOrderDetailsからのINSERT @foo(ID、[出荷数量]、サイズ)

。SELECT ID、[出荷数量]、[サイズ]。 (サイズ、CHARINDEX( 'X'、サイズ)-1))* CONVERT(浮動小数点、SUBSTRING(サイズ、CHARINDEX( 'X'、サイズCHARINDEX( 'X'、Size)> 0 AND CHARINDEX( ''、Size)> 0 AND Qty IS NULL; 0、CHARINDEX( ''、Size)> 0、CHARINDEX( ''、Size)

SELECT ID、[出荷数量]、サイズ、数量FROM @foo;

- * **** - このクエリは素晴らしい の結果 - 問題は、それは一時テーブル に挿入される、ということである - 私は、親表に即座にそれを更新したい:PlacedOrderDetails

0

私は誰も計算列を提案して驚いています。 私はAaron再正規化データ構造に同意します。 1つの列に2つの次元と1つの型を含めることはできません。これは3列にする必要があります。これはデータベースでは許可しないでください。

計算カラムの場合、これはトリガーを保存します。 SQL Serverでは、テーブルに移動し、列の数を変更し、「計算列の仕様」を目的の関数に設定します。 ここでは計算カラムの詳細を確認できます:http://msdn.microsoft.com/en-us/library/ms191250.aspx

関連する問題