COALESCE只在一个案例中工作

时间:2017-01-25 09:53:01

标签: sql-server tsql pivot ssms coalesce

我正在尝试更新ERP软件并阻止使用PIVOTS制作的表格中的语法

让我解释一下,我希望在我的表(功能性)中将所有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

以下是COALESCE不起作用的代码:

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 个答案:

答案 0 :(得分:0)

我没有太多可以继续这里,但它看起来像一个失踪的''。我认为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

尝试在联接的两边包含名称,以确保行完全返回。