2016-08-19 5 views
0

Ich habe einige SQL, die ich denke, ich könnte mit einer Funktion aufräumen, aber bin nicht erfahren in der Erstellung von ihnen.Create Funktion zur Auswahl des korrekten Währungsfelds aus einer Tabelle

Mein Code hat viele Abschnitte, die alle wie folgt aussehen:

ISNULL(SUM(Case 
when @Currency = 'AED' And Flag = 'Current' then BILLED_AED 
when @Currency = 'AUD' And Flag = 'Current' then BILLED_AUD 
when @Currency = 'BRL' And Flag = 'Current' then BILLED_BRL 
when @Currency = 'CAD' And Flag = 'Current' then BILLED_CAD 
when @Currency = 'CNY' And Flag = 'Current' then BILLED_CNY 
when @Currency = 'EUR' And Flag = 'Current' then BILLED_EUR 
when @Currency = 'GBP' And Flag = 'Current' then BILLED_GBP 
when @Currency = 'HKD' And Flag = 'Current' then BILLED_HKD 
when @Currency = 'INR' And Flag = 'Current' then BILLED_INR 
when @Currency = 'LYD' And Flag = 'Current' then BILLED_LYD 
when @Currency = 'QAR' And Flag = 'Current' then BILLED_QAR 
when @Currency = 'SAR' And Flag = 'Current' then BILLED_SAR 
when @Currency = 'SGD' And Flag = 'Current' then BILLED_SGD 
when @Currency = 'USD' And Flag = 'Current' then BILLED_USD 
when @Currency = 'VEF' And Flag = 'Current' then BILLED_VEF 
when @Currency = 'ZAR' And Flag = 'Current' then BILLED_ZAR 
End),0) As Total_Billed 

Das ist mein Code massiv lang macht und ich bin der Hoffnung, zu verkürzen. Kann ich eine Funktion erstellen, in der ich den Parameter @Currency zur Verfügung stelle (den der Benutzer beim Ausführen des Berichts ausgewählt hat) und den richtigen BILLED-Wert erhält (z. B.)? Also würde ich in die Funktion die @Currency, @Flag und @Field eingeben - im obigen Beispiel "BILLED_" wird der richtige Währungscode angehängt.

Ich hoffe, das macht Sinn - vielen Dank im Voraus für jede Hilfe.

+2

Markieren Sie die von Ihnen verwendeten dbms. (Dieser Code ist nicht ANSI SQL.) – jarlh

+3

Dies * schreit *, dass Sie eine Spalte "Currency" in Ihrer Tabelle und eine andere mit dem 'Bill'-Wert haben sollten, anstatt einer Spalte pro Währung. Oder nur eine Tabelle mit der Währungsumrechnung – Lamak

+0

Warum erstellen Sie keine Tabelle und treten Sie ihr bei ..? – scaisEdge

Antwort

0

Sie können Ihren Code (etwas) so etwas komprimieren.

isnull(sum(case Flag 
       when 'Current' then case @Currency 
         when 'AED' then BILLED_AED 
         when 'AUD' then BILLED_AUD 
         --and so on 
         end 
      end), 0) As Total_Billed 
0

die unter Abfrage Versuchen ..

DECLARE @sqlCommand varchar(max) 
DECLARE @Currency VARCHAR(50)='USD' 
SET @sqlCommand = 'SELECT ISNULL(SUM( 
         CASE WHEN ISNULL('[email protected]+','''')!='''' and Flag = ''Current''      
          THEN BILLED_'[email protected]+' END),0) AS As Total_Billed 
        FROM YourTable' 

EXEC (@sqlCommand) 
0

Ich werde Ihnen vorschlagen, eine Tabelle der Währungen zu halten, die übernommen werden, so dass das System skalierbar sein kann mehr Währungen enthalten, wie sie kommen. So haben Sie eine Tabelle wie:

Table name: Accepted Currency 

Currency 

AED 
AUD 
BRL 
CAD 
CNY 
EUR 
GBP 
HKD 
INR 
LYD 
QAR 
SAR 
SGD 
USD 
VEF 
ZAR 

auf der obigen Tabelle Basierend Sie eine gespeicherte Prozedur wie folgt erstellen:

CREATE PROCEDURE [dbo].[usp_CurrencySelector] 
(
    @Curr VARCHAR(10) 
) 
AS 
BEGIN 

    SELECT ISNULL(CONCAT('BILLED_', [Currency]), '0') 
    FROM [Accepted Currency] 
    WHERE Currency = @Curr 
END 

diese Funktion nur ausführen, wenn Sie die Flagge und anderen Bereichen haben, wie pro Ihre Anforderungen.

Verwandte Themen