2017-05-08 2 views
1

Wir verwenden eine auf ColdFusion basierende Housing-Software und verwenden SQL zum Erstellen von Datenbankfunktionen in unseren Berichten. Ich arbeite an einem benutzerdefinierten Bericht, um zu versuchen, eine Spalte von einer anderen zu subtrahieren: genauer COUNT_OF_INSPECTION_TYPE von OCCUPANCY subtrahieren. Die OCCUPANCY Spalte auf dem folgenden Code basiert:SQL-Fehlerbericht - [Macromedia] [SQLServer JDBC-Treiber] [SQLServer] Ungültiger Spaltenname

CONVERT(INT 
     , CASE 
       WHEN tblHalls.HALLNAME = 'Hall1' THEN 198 
       WHEN tblHalls.HALLNAME = 'Hall2' THEN 430 
       WHEN tblHalls.HALLNAME = 'Hall3' THEN 333 
     END 
    ) 

Wenn ich versuche, eine neue Funktion OCCUPANCY - COUNT_OF_INSPECTION_TYPE, erhalte ich eine Fehlermeldung:

Unable to invoke CFC - Error Executing Database Query. [Macromedia][SQLServer JDBC Driver][SQLServer]Invalid column name 'OCCUPANCY'.

Ich bin nicht sicher, ob ich dieses Recht habe zu erklären. Ich würde mich über jede Hilfe freuen, die Sie anbieten können.

+0

Welche Art von Funktion genau? Welche Anwendung wirft den Fehler auf? Ohne mehr zu wissen, klingt dies wie ein SQL- oder Reporting-Problem. Es ist jedoch schwierig, ohne weitere Details zu beraten. – Leigh

+0

Dies ist der Fehler, den ich erhalte FEHLERMELDUNG: CFC kann nicht aufgerufen werden - Fehler beim Ausführen der Datenbankabfrage. FEHLERDETAIL: [Macromedia] [SQLServer JDBC-Treiber] [SQLServer] Ungültiger Spaltenname "OCCUPANCY". – DANNYJ1

+1

(Edit) Ohh ... Sie können einen * Alias ​​* in einer Berechnung nicht auf der gleichen Ebene (dh vor der Definition) verwenden. Die Auswahlmöglichkeiten sind entweder a) Wiederholen der gesamten case-Anweisung in der Berechnung ODER b) Verwenden einer anderen Option wie ein CTE, abgeleitete Abfrage, der "apply-Operator usw.". Siehe http://sqlmag.com/blog/tip-apply-and-reuse-column-aliases – Leigh

Antwort

5

Sie können alias nicht erstellen und in einer anderen Berechnung auf derselben Ebene verwenden, da der Alias ​​noch nicht definiert ist. Entweder wiederholen Sie die gesamte -Anweisung in der Berechnung (weniger wünschenswert) ODER verwenden Sie eine andere Option, z. B. CTE, derived table, APPLY operator, etcetera.

Wrapping Ihre vorhandenen SELECT in einem CTE ist wahrscheinlich eine der einfachsten Möglichkeiten:

;WITH cte 
AS 
(
    -- Your current SELECT statement goes here 
    SELECT 
     CONVERT(INT 
       , CASE 
         WHEN tblHalls.HALLNAME = 'Hall1' THEN 198 
         WHEN tblHalls.HALLNAME = 'Hall2' THEN 430 
         WHEN tblHalls.HALLNAME = 'Hall3' THEN 333 
       END 
     ) 
     AS OCCUPANCY 
     , tblHalls.COUNT_OF_INSPECTION_TYPE 
     , ... (Other Columns) 
    FROM tblHalls 
) 
-- Now use the alias in a calculation 
SELECT cte.* 
     , cte.OCCUPANCY - cte.COUNT_OF_INSPECTION_TYPE AS SomeAliasForThisCol 
FROM cte 

Randnotiz, da die CASE-Anweisung eine ELSE Bedingung definiert nicht, das Ergebnis der Berechnung NULL sein wird, wenn keine von HallName's Übereinstimmung. Wenn dies nicht erwünscht ist, sollten Sie einen Standardwert festlegen.