मैं एक अनुरोध पर काम कर रहा हूं कि मुझे किसी अन्य कॉलम में निर्दिष्ट सूत्र के आधार पर मूल्य की गणना करने की आवश्यकता है

नीचे मेरी तालिका है:

enter image description here

मुझे मूल्य प्राप्त करने के लिए क्वेरी लिखनी है जो FORMULA कॉलम पर आधारित होगी। उदाहरण के लिए मुझे परिणाम चाहिए

enter image description here

चूंकि सूत्र कुछ भी हो सकता है जिसमें मेरे कॉलम PRICE और SIZE शामिल हों, मैं इसे प्राप्त करने के लिए क्वेरी कैसे लिखूं?

1
RobertKing 7 अगस्त 2017, 15:21

3 जवाब

सबसे बढ़िया उत्तर

एक अन्य विकल्प जो करना अपेक्षाकृत आसान है वह है सीएलआर। सी # में एक साधारण एक लाइन कोड देने के लिए आप डेटाटेबल की गणना विधि का लाभ उठा सकते हैं।

[Microsoft.SqlServer.Server.SqlFunction]
public static double Evaluate(SqlString expression)
{
    return double.Parse((new DataTable()).Compute(expression.ToString(), "").ToString());
}

फिर असेंबली को SQL सर्वर में जोड़ें और रैपर फ़ंक्शन बनाएं:

CREATE FUNCTION [dbo].[Evaluate](@expression [nvarchar](4000))
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [YourAssemblyName].[YourClassName].[Evaluate]
GO 

अब आप एक साधारण चयन कथन के भाग के रूप में फ़ंक्शन को कॉल कर सकते हैं:

SELECT itemid, price, size, formula, 
dbo.Evaluate(REPLACE(REPLACE(formula, 'PRICE', FORMAT(price,'0.00')), 
'SIZE', FORMAT(size, '0'))) as calcvalue FROM YourTable
1
Jonathan Willcock 7 अगस्त 2017, 17:00

यह मानते हुए कि आपको जिस सूत्र का उपयोग करने की आवश्यकता है वह एक कॉलम में एक मान पर निर्भर करता है जैसे: आकार आप एक मामले का उपयोग कर सकते हैं जब

    select price, size, when size= 2  then (price*1.2)/size 
           when size= 3 then price/size 
           end  my_calc
    from my_table 
0
scaisEdge 7 अगस्त 2017, 15:29

मैंने भी ऐसा ही कुछ किया है और अगर आप ऑपरेशन के छोटे पूल में खेलते हैं तो यह इतना मुश्किल नहीं है। मैं एक श्रृंखला के साथ गया जहां मेरे पास एक्स और वाई कॉलम और एक ऑपरेटर था। तब मैंने बस एक बड़ा मामला किया जब ऑपरेटर की पहचान करने और उसके आधार पर तर्क करने पर बयान दिया। आपको अपनी संरचना में थोड़ा बदलाव करना पड़ सकता है। समस्या का मूल यह है कि एसक्यूएल एक परिणाम सेट आधारित इंजन है, इसलिए कुछ भी जहां आपको गतिशील निर्धारित करने के लिए एक ऑपरेशन करना है, वह धीमा होने वाला है। ईजी:

DECLARE @Formula TABLE 
(
  FormulaId INT IDENTITY
, FormulaName VARCHAR(128)
, Operator VARCHAR(4)
);

DECLARE @Values TABLE 
( 
  ValueId INT IDENTITY
, FormulaId INT
, Price MONEY
, Size INT
)

INSERT INTO @Formula (FormulaName, Operator)
VALUES ('Simple Addition', '+'), ( 'Simple Subtraction', '-'), ('Simple Multiplication', '*'), ('Simple Division', '/'), ('Squared', '^2'), ('Grow by 20 percent then Multiply', '20%*')

INSERT INTO @Values (FormulaId, Price, Size)
VALUES (1, 10, 5),(2, 10, 5),(3, 10, 5),(4, 10, 5),(5, 10, 5),(6, 10, 5),(1, 16, 12),(6, 124, 254);

Select *
From @Values

SELECT
  f.FormulaId
, f.FormulaName
, v.ValueId
, Price
, Operator
, Size
, CASE WHEN Operator = '+' THEN Price + Size 
      WHEN Operator = '-' THEN Price - Size 
      WHEN Operator = '*' THEN Price * Size
      WHEN Operator = '/' THEN Price / Size
      WHEN Operator = '^2' THEN Price * Price
      WHEN OPerator = '20%*' THEN (Price * 1.20) * Size
      END AS Output
FROM @Values v
  INNER JOIN @Formula f ON f.FormulaId = v.FormulaId

इस पद्धति के साथ मेरा ऑपरेशन वास्तव में केवल एक अन्य तालिका के लिए एक सूचक संदर्भ है जिसमें एक ऑपरेटर है जो वास्तव में सभी उद्देश्यों और उद्देश्यों के लिए है, केवल एक टोकन जो मैं अपने केस स्टेटमेंट के लिए उपयोग करता हूं। आप इसे संभावित रूप से कंपाउंड भी कर सकते हैं और यदि आप मल्टीपल पास करना चाहते हैं तो आप एक 'ग्रुप' कॉलम और एक 'सीक्वेंस' जोड़ सकते हैं और एक के बाद एक कर सकते हैं। यह निर्भर करता है कि आपके 'सूत्र' कितने कठिन हो जाते हैं। क्योंकि यदि आप 3 या 4 से अधिक चर में आते हैं जो बार-बार ऑपरेटर परिवर्तन के साथ बदलते हैं, तो आप शायद गतिशील एसक्यूएल करना चाहेंगे। लेकिन अगर वे केवल कुछ चीजें हैं, तो यह इतना कठिन नहीं होना चाहिए। बस ध्यान रखें कि इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह एक निश्चित स्तर पर हार्ड कोडित है, फिर भी लचीला है कि इसमें लगाए गए पैरामीटर इस सूत्र को बार-बार लागू कर सकते हैं।

0
djangojazz 8 अगस्त 2017, 01:26