2017-01-25 11 views
1

Я пытаюсь обновить программное обеспечение ERP и заблокировать на синтаксисе в таблице сделаны с цапфCOALESCE работает только в одном случае

Позвольте мне объяснить, я хотел бы в моей таблице (который является функциональным), что все Значения NULL должны быть заменены на 0.

В другой таблице, почти идентичной с тем же синтаксисом, мне удалось, но в другом случае COALESCE не работают. Я застрял на ней в течение довольно долгого времени. Если кто-то может просветить меня ..

Вот начало коды для таблицы, где функция Coalesce (я кладу только начало, потому что код составляет 500 строк, а остальное остается неизменными)

DECLARE @VALEUR VARCHAR(10) 

SET @VALEUR = RTRIM(CAST(:A_USER AS VARCHAR(10))) 
      --Cette valeur va correspondre à l'id de la personne connectée 
SET language us_english 

DECLARE @P_A_USER VARCHAR(10) 
SELECT @P_A_USER = VALEUR FROM T_PARAMETRE 
WHERE PARAGRAPHE = 'COD_PRTDIRCOMM' 



DECLARE @COD_GRP VARCHAR(10) 
SELECT @COD_GRP = COD_GRP FROM USERS WHERE COD_USER = @VALEUR 

IF @P_A_USER = 'GBL' 
    BEGIN 
    SET @P_A_USER = NULL 
END 

SELECT * 
FROM (SELECT 'CA Total facturé' AS DONNEE 
    UNION 
    SELECT 'Marge total (en €)' AS DONNEE 
    UNION 
    SELECT 'Marge total (en %)' AS DONNEE 
    UNION 
    SELECT 'CA Exploitation facturé' AS DONNEE 
    UNION 
    SELECT 'Marge Exploitation (en €)' AS DONNEE 
    UNION 
    SELECT 'Marge Exploitation (en %)' AS DONNEE 
    UNION 
    SELECT 'CA Service facturé' AS DONNEE 
    UNION 
    SELECT 'Marge Service (en €)' AS DONNEE 
    UNION 
    SELECT 'Marge Service (en %)' AS DONNEE 
    UNION 
    SELECT 'CA Solution facturé' AS DONNEE 
    UNION 
    SELECT 'Marge Solution facturé (en €)' AS DONNEE 
    UNION 
    SELECT 'Marge Solution facturé (en %)' AS DONNEE) Q 
    LEFT OUTER JOIN (
    -----------------------------------DEBUT TOTAL----------------------------  
    SELECT donnee, 
      NUMLIGNE, 
      COALESCE(january, 0) AS JANUARY, 
      COALESCE(february, 0) AS FEBRUARY, 
      COALESCE(march, 0)  AS MARCH, 
      COALESCE(april, 0)  AS APRIL, 
      COALESCE(may, 0)  AS MAY, 
      COALESCE(june, 0)  AS JUNE, 
      COALESCE(july, 0)  AS JULY, 
      COALESCE(august, 0) AS AUGUST, 
      COALESCE(september, 0) AS SEPTEMBER, 
      COALESCE(october, 0) AS OCTOBER, 
      COALESCE(november, 0) AS NOVEMBER, 
      COALESCE(december, 0) AS DECEMBER 
    FROM (SELECT Datename(month, date_facture) AS 'MOIS' 
        , 
        Cast(Sum(n1)AS DECIMAL (18, 2)) AS 
        'CA_Total_mois', 
        'CA total facturé' AS 'DONNEE', 
        'A'        AS 'NUMLIGNE' 
      FROM v_facture 
      WHERE cod_com = ISNULL(@P_A_USER, cod_com) 
        AND Year(date_facture) = '2016' 
      GROUP BY Datename(month, date_facture)) AS ca_total_mois 
      PIVOT(Sum(ca_total_mois) 
       FOR mois IN (january, 
          february, 
          march, 
          april, 
          may, 
          june, 
          july, 
          august, 
          september, 
          october, 
          november, 
          december)) AS pvt1 
    ------------------------------------------------------------------------- 

    UNION ALL 
    SELECT donnee, 
      NUMLIGNE, 
      COALESCE(january, 0) AS JANUARY, 
      COALESCE(february, 0) AS FEBRUARY, 
      COALESCE(march, 0)  AS MARCH, 
      COALESCE(april, 0)  AS APRIL, 
      COALESCE(may, 0)  AS MAY, 
      COALESCE(june, 0)  AS JUNE, 
      COALESCE(july, 0)  AS JULY, 
      COALESCE(august, 0) AS AUGUST, 
      COALESCE(september, 0) AS SEPTEMBER, 
      COALESCE(october, 0) AS OCTOBER, 
      COALESCE(november, 0) AS NOVEMBER, 
      COALESCE(december, 0) AS DECEMBER 
    FROM (SELECT Datename(month, date_facture) AS 'MOIS', 
        Cast(Sum(n2)AS DECIMAL (18, 2)) AS 
        'Marge_Total_mois', 
        'Marge total (en €)'  AS 'DONNEE', 
        'B'        AS 'NUMLIGNE' 
      FROM v_facture 
      WHERE cod_com = ISNULL(@P_A_USER, cod_com) 
        AND Year(date_facture) = '2016' 
      GROUP BY Datename(month, date_facture)) AS 
      Marge_Total_Mois 
      PIVOT(Sum(marge_total_mois) 
       FOR mois IN (january, 
          february, 
          march, 
          april, 
          may, 
          june, 
          july, 
          august, 
          september, 
          october, 
          november, 
          december)) AS pvt2 
    ------------------------------------------------------------------------ 

    UNION ALL 


-- Etc ... 
-- The end : 

) Q2 
       ON Q2.donnee = Q.donnee 
ORDER BY NUMLIGNE ASC 

Вот таблица он относится к: 1st TABLE

А вот код, где срастается не работают:

DECLARE @VALEUR VARCHAR(10) 

SET @VALEUR = RTRIM(CAST(:A_USER AS VARCHAR(10))) 
      -- This value will match the id of the connected person 

SET language us_english 

DECLARE @P_A_USER VARCHAR(10) 
SELECT @P_A_USER = VALEUR FROM T_PARAMETRE 
WHERE PARAGRAPHE = 'COD_PRTDIRCOMM' 



DECLARE @COD_GRP VARCHAR(10) 
SELECT @COD_GRP = COD_GRP FROM USERS WHERE COD_USER = @VALEUR 

IF @P_A_USER = 'GBL' 
    BEGIN 
    SET @P_A_USER = NULL 
END 

SELECT * 
FROM (SELECT 'Nouveaux contrats' AS DONNEE 
    UNION 
    SELECT 'Contrats Renouvelés' AS DONNEE 
    UNION 
    SELECT 'RDV Réalisés' AS DONNEE 
    UNION 
    SELECT 'RDV Planifiés' AS DONNEE 
    UNION 
    SELECT 'Nouveaux comptes ouverts' AS DONNEE 
    UNION 
    SELECT 'Nouvelles affaires' AS DONNEE 
    UNION 
    SELECT 'Nvl affaires avec exploitations' AS DONNEE 
    UNION 
    SELECT 'CA Nouvelles affaires (€)' AS DONNEE 
    UNION 
    SELECT 'Affaires gagnées' AS DONNEE 
    UNION 
    SELECT 'Affaires perdues' AS DONNEE 
    UNION 
    SELECT 'Taux affaires gagnées' AS DONNEE) Q 
    LEFT OUTER JOIN (
    -----------------------------------DEBUT TOTAL---------------------------- 

    SELECT donnee, 
      NUMLIGNE, 
      COALESCE(january, 0) AS JANUARY, 
      COALESCE(february, 0) AS FEBRUARY, 
      COALESCE(march, 0)  AS MARCH, 
      COALESCE(april, 0)  AS APRIL, 
      COALESCE(may, 0)  AS MAY, 
      COALESCE(june, 0)  AS JUNE, 
      COALESCE(july, 0)  AS JULY, 
      COALESCE(august, 0) AS AUGUST, 
      COALESCE(september, 0) AS SEPTEMBER, 
      COALESCE(october, 0) AS OCTOBER, 
      COALESCE(november, 0) AS NOVEMBER, 
      COALESCE(december, 0) AS DECEMBER 
    FROM (SELECT Datename(month, d1) AS 'MOIS' 
        , 
        Cast(Count(*)AS DECIMAL (18, 2)) AS 
        'Total_Nouveaux_Contrats', 
        'Nouveaux contrats' AS 'DONNEE', 
        'A'        AS 'NUMLIGNE' 
      FROM contrat 
      WHERE c22 = ISNULL(@P_A_USER, c22) 
        AND Month(D1)= MONTH(getdate()) 
        AND C27 = 'Nouveau contrat' 
      GROUP BY Datename(month, d1)) AS Total_Nouveaux_Contrats 
      PIVOT(Sum(Total_Nouveaux_Contrats) 
       FOR mois IN (january, 
          february, 
          march, 
          april, 
          may, 
          june, 
          july, 
          august, 
          september, 
          october, 
          november, 
          december)) AS pvt1 
    ------------------------------------------------------------------------- 

    UNION ALL 
    SELECT donnee, 
      NUMLIGNE, 
      COALESCE(january, 0) AS JANUARY, 
      COALESCE(february, 0) AS FEBRUARY, 
      COALESCE(march, 0)  AS MARCH, 
      COALESCE(april, 0)  AS APRIL, 
      COALESCE(may, 0)  AS MAY, 
      COALESCE(june, 0)  AS JUNE, 
      COALESCE(july, 0)  AS JULY, 
      COALESCE(august, 0) AS AUGUST, 
      COALESCE(september, 0) AS SEPTEMBER, 
      COALESCE(october, 0) AS OCTOBER, 
      COALESCE(november, 0) AS NOVEMBER, 
      COALESCE(december, 0) AS DECEMBER 
    FROM (SELECT Datename(month, d1) AS 'MOIS', 
        Cast(Count(*)AS DECIMAL (18, 2)) AS 
        'Total_Contrats_Renouveles', 
        'Contrats Renouvelés'  AS 'DONNEE', 
        'B'        AS 'NUMLIGNE' 
      FROM contrat 
      WHERE c22 = ISNULL(@P_A_USER, c22) 
        AND Month(D1)= MONTH(getdate()) 
        AND (c27 = NULL 
         OR c27 = 'nouveau contrat') 
      GROUP BY Datename(month, d1)) AS 
      Total_Contrats_Renouveles 
      PIVOT(Sum(Total_Contrats_Renouveles) 
       FOR mois IN (january, 
          february, 
          march, 
          april, 
          may, 
          june, 
          july, 
          august, 
          september, 
          october, 
          november, 
          december)) AS pvt2 
    ------------------------------------------------------------------------ 

    UNION ALL 

-- ETC ... 

-- La fin : 

) Q2 
       ON Q2.donnee = Q.donnee 
ORDER BY NUMLIGNE ASC 

А вот таблица возвращает такой пользователь для обоих, для которых не существует большое значение 2nd TABLE

я заметил, что до тех пор, пока существует значение в строке, которая отличается от 0, то оно будет отображаться все остальные значения этой строки, которые равны нулю при 0 (коалесцы будут работать в этом случае там o_O)

Итак, извините за роман и благодарю вас за внимание!

Я использую SSMS для тестирования мой запрос, но я использую код в ERP программного обеспечения

+1

Тег dbms, который вы используете. (Код продукта определен.) – jarlh

+0

Я использую SSMS –

+1

SSMS не является dbms, вы используете SQL Server правильно. Но видя, что coalesce «не работает» - это означает, что ценность, которую он получает, не является NULL, как вы ожидаете, но может быть пустой строкой или чем-то еще. Поэтому попробуйте выбрать само значение без COALESCE и посмотреть, что вы получаете. –

ответ

0

У меня не так много, чтобы идти здесь, но это выглядит как недостающий «s». Я думаю, что COALESCE работает, но LEFT OUTER JOIN не работает.

SELECT * 
FROM (SELECT 'Nouveaux contrats' AS DONNEE 
    UNION 

, а затем

WHERE c22 = ISNULL(@P_A_USER, c22) 
    AND Month(D1)= MONTH(getdate()) 
    AND (c27 = NULL 
     OR c27 = 'nouveau contrat') 
GROUP BY Datename(month, d1)) AS 

Try включая имя с обеих сторон объединения для обеспечения строка возвращается на всех.