2016-11-29 3 views
0

Ich habe zwei Tabelle Wert-Funktion, die ich tun muss einige wählt ... Ich habe versucht, UNION auf das wählt, aber ich kann nicht "Union alle" tun zu meinen IF ... Es sollte jeder, wenn die Bedingung ... sollten Dieser Code zurückgeben eine Zeile und zwei Spalten zurück:SQL Server ... Union alle auf zwei IF-Bedingungen

September | 50 

October | 33 

, wie kann ich das tun?

das war mein Code:

IF (select TotalTreinos from dbo.tbl_CALCULA_TREINOS_MES('20160901','20160930',2,5)) = (SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Setembro',9,2)) 
    SELECT 'Setembro' as Mes, 100 AS PercentPresencas 
else 
    select 'Setembro' as Mes, (((SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Setembro',9,2)) * 100)/(select TotalTreinos from dbo.tbl_CALCULA_TREINOS_MES('20160901','20160930',2,5))) as PercentPresencas 

union all 

IF (select TotalTreinos from dbo.tbl_CALCULA_TREINOS_MES('20161001','20161031',2,5)) = (SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Outubro',10,2)) 
    SELECT 'Outubro' as Mes, 100 AS PercentPresencas 
else 
    select 'Outubro' as Mes,(((SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Outubro',10,2)) * 100)/(select TotalTreinos from dbo.tbl_CALCULA_TREINOS_MES('20161001','20161031',2,5))) as PercentPresencas 
+1

Können Sie einige Beispiele umfassen Tabellendaten? –

+0

Wenn die Werte gleich sind, wird die Division 1 zurückgeben, nein? Für was sind diese IFs da? –

Antwort

1

Die IF Anweisung in T-SQL ist eine unbedingte Anweisung, die nicht Teil der SQL-Sprache. Was Sie tun möchten, ist innerhalb der Abfrage, dass IF Aussage bewegen, wo Sie CASE stattdessen verwenden sollten:

SELECT 
    'Setembro' AS Mes, 
    CASE WHEN (SELECT TotalTreinos FROM dbo.tbl_CALCULA_TREINOS_MES('20160901','20160930',2,5)) 
      = (SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Setembro',9,2)) 
     THEN 100 
     ELSE (((SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Setembro',9,2)) * 100) 
      /(SELECT TotalTreinos FROM dbo.tbl_CALCULA_TREINOS_MES('20160901','20160930',2,5))) 
    END AS PercentPresencas 
UNION ALL 
SELECT 
    'Outubro' AS Mes, 
    CASE WHEN (SELECT TotalTreinos FROM dbo.tbl_CALCULA_TREINOS_MES('20161001','20161031',2,5)) 
      = (SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Outubro',10,2)) 
     THEN 100 
     ELSE (((SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS('Outubro',10,2)) * 100) 
      /(SELECT TotalTreinos FROM dbo.tbl_CALCULA_TREINOS_MES('20161001','20161031',2,5))) 
    END AS PercentPresencas 

Eine weitere Verbesserung mit CTE durch gemeinsame Ausdrücke Ausklammerung:

WITH 
    t1 (Mes, StartDate, EndDate) AS (
    -- Of course, these could be calculated also automatically, but you get the idea... 
    SELECT 'Setembro', '20160901', '20160930' 
    UNION ALL 
    SELECT 'Outubro', '20161001', '20161031' 
), 
    t2 (Mes, TotalTreinos, Presencas) AS (
    SELECT 
     Mes, 
     (SELECT TotalTreinos FROM dbo.tbl_CALCULA_TREINOS_MES(StartDate,EndDate,2,5)), 
     (SELECT Presencas FROM DBO.tbl_CALCULA_PRESENCAS(Mes,10,2)) 
    FROM t1 
) 
SELECT 
    Mes, 
    CASE WHEN TotalTreinos = Presencas 
     THEN 100 
     ELSE Presencas * 100/TotalTreinos 
    END AS PercentPresencas 
FROM t2 
+0

Obrigado ... funcionou perfeito ... Deu für die Anpassung ao que eu preciso ... –

+0

@HelderPinto: Sorry, ich spreche kein Portugiesisch :) –

+1

Sorry .. nur zu sagen, dass es perfekt funktioniert ... nur mit Klein passt sich meinen Bedürfnissen an ... Vielen Dank ... –