2009-10-14 7 views
9

Ich möchte den Aliasnamen basierend auf dem Wert eines anderen Spaltennamens in der Abfrage in SQL Server anzeigen. Für z.B.Dynamische Aliase in der SQL-Anweisung

SELECT P.Amount AS (CASE P.Type WHEN 'Individual' THEN 'Salary' ELSE 'Profit' END) 
    FROM Person P 

Ich weiß das oben ist nicht richtig, aber etwas wie das wird helfen.

Antwort

12

Ich bin mir nicht sicher, ob Sie hinzufügen können dynamische Aliase, aber Sie sollten in der Lage sein, so etwas zu tun (wenn Sie nur ein paar mögliche Aliase haben):

SELECT 
    CASE P.Type WHEN 'Individual' THEN P.Amount ELSE NULL END AS Salary, 
    CASE P.Type WHEN 'Individual' THEN NULL ELSE P.Amount END AS Profit 
FROM 
    Person p 
+0

+1 Gute Stelle, das kann tatsächlich tun, wonach er sucht. Darf nicht daran denken. –

+0

Danke, das ist definitiv die beste Lösung, die ich bekommen konnte –

1

Sie müssten Betrag als "Betrag" zurückgeben und dann eine zusätzliche Spalte zurückgeben, die den "Typ" für diesen Betrag enthält.

i.e.g

SELECT P.Amount, CASE P.Type WHEN 'Individual' THEN 'Salary' ELSE 'Profit' END AS AmountType 
FROM Person P 
2

Der "Alias" ist der Name der gesamten Spalte der Daten, die Sie zurückkehren werden. Es ist nicht möglich, dies auf einer "by row" -Basis zu ändern.

Die einzige Möglichkeit, den Spaltennamen (Alias) dynamisch zu ändern, besteht in der Verwendung von dynamischem SQL zum Erstellen der Abfrage. Dies scheint jedoch nicht das zu sein, was Sie tun möchten.

+2

Und sogar dynamische SQL kann nur einen Namen für den Alias ​​für eine ganze gegebene Abfrage wählen. – mjv

1

Geht nicht ...

SQL gibt eine recorset die nur einen Namen/Alias ​​für jede Spalte haben kann.
Welcher Name würde es wählen Beispiel gegeben, wenn einige Datensätze, die von der Abfrage zurückgegeben wurden, waren "Individuum" und einige waren ein anderer Typ? Wie in mehreren Antworten vorgeschlagen, können Sie natürlich die Anzahl der von der Abfrage zurückgegebenen Spalten ändern und jede Spalte wie gewünscht benen- nen, sich aber mit einer solchen Ergebnismenge befassen, die dann zusätzliche Logik erfordern kann, was den Zweck seither zunichte machen würde Wenn jemand extra Logik möchte, kann er/sie nur den Betrag und den Typ auswählen und diese Werte für die Attributbenennung und dergleichen auf der Ebene der Anwendung abarbeiten ...

0

Eine Spalte kann nur einen Namen haben. Wenn Ihr Rowset nur eine Zeile enthält, können Sie zuerst die Type-Spalte der Zeile anzeigen und dann den Spaltennamen für die Auswahl entsprechend ändern. Wenn es mehrere Zeilen enthält, ist es einfach nicht möglich.

IF 1 = (SELECT COUNT(*) FROM Person P WHERE <where-criteria>) THEN 
    IF 'Individual' = (SELECT P.Type FROM Person P WHERE <where-criteria>) THEN 
     SELECT P.Amount AS Salary 
     FROM Person P 
     WHERE <where-criteria> 
    ELSE 
     SELECT P.Amount AS Profit 
     FROM Person P 
     WHERE <where-criteria> 
    END IF 
ELSE 
    SELECT P.Amount AS SalaryOrProfit 
    FROM Person P 
    WHERE <where-criteria> 
END IF 

Ich denke, dass Sie Ihr Design möglicherweise überprüfen müssen.