2016-11-29 10 views
0

私はいくつかの選択を行う必要がある2つのテーブル値関数を持っています... 私はUNIONを選択しようとしていましたが、 "union all"私のIFに... それは1行2列のそれぞれの場合の条件を返す必要があります... このコードは返す必要があります:私はこれを行うことができますどのようにSQL Server ... 2つのIF条件のすべての連合

September | 50 

October | 33 

を?!

これは私のコードだった:

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

あなたには、いくつかのサンプルを含むことができ、何がやりたいことは、あなたが代わりにCASEを使用する必要があり、クエリ、内部IF文があること移動でありますテーブルデータ? –

+0

値が等しい場合、除算は1を返します。いいえ?それらのIFは何のためにありますか? –

答えて

1

T-SQLでIF文は無条件文ではなく、SQL言語の一部です。

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 

共通の表現を因数分解することにより、CTEとのさらなる改善:

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 ... デュアル・パラ・アダプター・ア・キュー・ユー・プレシジョン... –

+0

@HelderPinto:申し訳ありません、ポルトガル語を話しません:) –

+1

申し訳ありません。小さな私のニーズに適応...非常にありがとう... –

関連する問題