MSSQL循环 - 如何

时间:2016-01-26 15:10:45

标签: sql-server loops with-statement

我需要你的帮助: 我有一个表,其中 ID_Erreur_CallBack 可以是NULL,0,1,2,3,4,5或6。 如果我执行:

SELECT ID_SkillGroup AS Competence
    ,ID_Erreur_CallBack
    ,count(*) AS Nombre_de_Ocurrences
    ,CASE ID_Erreur_CallBack
        WHEN '0'
            THEN 'Abandon pendant l’exécution du script (le client a raccroché)'
        WHEN '1'
            THEN 'Ligne occupée'
        WHEN '2'
            THEN 'Le client n’a pas confirmé en appuyant sur étoile'
        WHEN '3'
            THEN 'Le client n’a pas décroché'
        WHEN '4'
            THEN 'Le numéro de téléphone du client est invalide'
        WHEN '5'
            THEN 'Problemes de ressources lors de l’appel'
        WHEN '6'
            THEN 'Echec de l’appel'
        ELSE 'Appel réussi'
        END AS Description_Erreur
FROM dbo.TB_WCB_USER
WHERE Date_Heure_Insert BETWEEN '01/11/2015'
        AND '01/12/2015'
    AND TYPE = 'WCB'
GROUP BY ID_SkillGroup
    ,ID_Erreur_CallBack
ORDER BY ID_SkillGroup
    ,ID_Erreur_CallBack ASC

我举个例子: Result

我想创建一个SELECT语句,我可以将 ID_Erreur_CallBack 从0改为6,即使 Nombre_de_Ocurrences 为0(或NULL)也为NULL。就像是: Result I wish

谢谢!

2 个答案:

答案 0 :(得分:1)

而不是使用CASE您可以使用错误描述创建一个表,如果您想要添加或更新文本,那么这种方式很容易保留,不需要更改代码。

喜欢错误

 error_id  error_text
    1        err1
    2        err2
    3        err3
    ....
   100      'Appel réussi'

然后使用LEFT JOIN

  select ID_SkillGroup as Competence,
         E.error_id as ID_Erreur_CallBack,
         E.error_text as Description_Erreur,
         count(*) as Nombre_de_Ocurrences
  FROM errors E
  LEFT JOIN TB_WCB_USER W
         ON E.error_id = ID_Erreur_CallBack

我发现ELSE

上有CASE

你可以做这样的事情

  LEFT JOIN TB_WCB_USER W
         ON E.error_id = CASE ID_Erreur_CallBack
                              WHEN > 99 then 100   -- 'Appel réussi'
                              ELSE ID_Erreur_CallBack
                          END

答案 1 :(得分:0)

感谢Juan Carlos的答案。

我终于使用了CROSS JOIN

/*Creation de table temporaire et remplisage avec NULL*/
WITH T1 AS (
SELECT n = 0
UNION ALL
SELECT n + 1 FROM T1 WHERE n < 6
)

SELECT n INTO #Temp_Cesar FROM T1
INSERT INTO #Temp_Cesar (n) VALUES (NULL)
SELECT t1.ID_SkillGroup as Competence,t2.n as ID_Erreur_CallBack
INTO #Temp_Cesar1
FROM dbo.TB_SKILLGROUP t1
CROSS JOIN #Temp_Cesar t2
ORDER BY t1.ID_SkillGroup
ALTER TABLE #Temp_Cesar1 ADD Nombre_de_Ocurrences INT NULL, Description_Erreur VARCHAR(30) NULL;
select Competence,isnull(ID_Erreur_CallBack,99) as ID_Erreur_CallBack,isnull(Nombre_de_Ocurrences,0) as Nombre_de_Ocurrences,
Case ID_Erreur_CallBack
WHEN '0' THEN 'Abandon pendant l’exécution du script (le client a raccroché)'
WHEN '1' THEN 'Ligne occupée'
WHEN '2' THEN 'Le client n’a pas confirmé en appuyant sur étoile'
WHEN '3' THEN 'Le client n’a pas décroché'
WHEN '4' THEN 'Le numéro de téléphone du client est invalide'
WHEN '5' THEN 'Problemes de ressources lors de l’appel'
WHEN '6' THEN 'Echec de l’appel'
ELSE 'Appel réussi'
END AS Description_Erreur
into #Temp_Cesar11 from #Temp_Cesar1