私は思いますあなたのDBデザインは間違っています上記のDBデザインについて考えてみてください。あなたは少しだけ背景を投げてください。あなたはこのコミュニティで非常にプロフェッショナルなソリューションを得るでしょう。
私は何か試しただけで、他のサンプルデータでテストし、フィードバックを与えます。
DECLARE @TableB table(ID VARCHAR(50),FormulaID VARCHAR(50) ,VALUE INT)
INSERT INTO @TableB VALUES('X','1+2+3',NULL),('Y','1-2+3',NULL)
DECLARE @TableA table (ID INT,Amount INT)
INSERT INTO @TableA values(1,50),(2,40),(3,50)
declare @input varchar(50)='a+b-c*d'
declare @delimiter varchar(50)='-+/*'
;WITH CTE
AS (
SELECT id
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', FormulaID) > 0
THEN substring(FormulaID, 0, PATINDEX('%[' + @delimiter + ']%', FormulaID))
END numbers
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', FormulaID) > 0
THEN substring(FormulaID, PATINDEX('%[' + @delimiter + ']%', FormulaID), 1)
END delimeter
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', FormulaID) > 0
THEN stuff(FormulaID, 1, PATINDEX('%[' + @delimiter + ']%', FormulaID), '')
END input
,1 RN
,FormulaID
FROM @TableB
UNION ALL
SELECT id
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', input) > 0
THEN cast(substring(input, 0, PATINDEX('%[' + @delimiter + ']%', input)) AS VARCHAR(50))
ELSE cast(input AS VARCHAR(50))
END
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', input) > 0
THEN substring(input, PATINDEX('%[' + @delimiter + ']%', input), 1)
END
,CASE
WHEN PATINDEX('%[' + @delimiter + ']%', input) > 0
THEN stuff(input, 1, PATINDEX('%[' + @delimiter + ']%', input), '')
END
,RN + 1
,FormulaID
FROM cte
WHERE len(input) > 0
)
,CTE1
AS (
SELECT c.id
,c.numbers
,a.amount
,c.delimeter
,rn
,FormulaID
FROM CTE C
INNER JOIN @tableA a ON c.numbers = a.id
)
,CTE4
AS (
SELECT id
,formulaid
,amount
,delimeter
,numbers
,rn
FROM cte1
WHERE rn = 1
UNION ALL
SELECT a.id
,b.formulaid
,CASE
WHEN b.delimeter = '+'
THEN b.amount + a.amount
WHEN b.delimeter = '-'
THEN b.amount - a.amount
WHEN b.delimeter = '*'
THEN b.amount * a.amount
END
,a.delimeter
,a.numbers
,a.RN
FROM cte1 a
INNER JOIN cte4 b ON a.id = b.id
WHERE a.rn = b.rn + 1
)
SELECT id
,formulaid
,amount
FROM cte4
WHERE delimeter IS NULL
フロントエンドではもっと使いやすいかもしれないので、どのフロントエンドを使用していますか? 'テーブルA 'のレコードの数は固定されているか、少なくとも10未満ですか?操作の数は+と - に制限されていますか?ストアドプロシージャを使用していますか? – Ash
こんにちは、あなたのお返事ありがとうございます。それはフロントエンドで簡単かもしれませんが、私は店の手順でこれを処理します:)。テーブルAのレコード数は固定されておらず、10を超えることができ、演算は+と - だけでなく、(1 * 2) - (3 + 1)のようになります。 –
これを行う直接的な方法はないようですが、あなたはSPでも問題ないので、問題を分解してください:.....最初に[Table B]からFormulaIdを選択し、レコードをループして番号を取得してください'(+、 - 、*、/、(、))を' array'の中で検索しながら 'substring'を使うことで、文字列を出力することができます。配列の各要素に対して、[Table A]からId = ... 'の量を選択します。実際の値を含む文字列を取得したら、基本的に式を実行するために 'exec'を使います。 – Ash