【问题标题】:COALESCE working in only one caseCOALESCE 只在一种情况下工作
【发布时间】:2017-01-25 09:53:01
【问题描述】:

我正在尝试更新 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 软件中的代码

【问题讨论】:

  • 标记您正在使用的 dbms。 (那里有产品特定代码。)
  • 我正在使用 SSMS
  • SSMS 不是 dbms,您正在正确使用 SQL Server。但是看到合并“不起作用” - 这表明它获得的值不是您期望的 NULL ,而是可能是空字符串或其他东西。所以尝试选择没有 COALESCE 的值本身,看看你得到了什么。
  • 好吧,对不起,我不是英语,我不懂所有这些术语。我只得到 NULL,但是当它为 null 时,它在我的表中什么都没有显示,我想要一个 0,就像第一个表一样,当我删除第一个表中的 COALESCE 时,它什么也不返回。所以我在第二个中使用相同的 COALESCE 并使用相同的语法,但它不起作用

标签: sql-server tsql pivot ssms coalesce


【解决方案1】:

我在这里没什么可继续的,但它看起来像缺少了“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

尝试包括连接两边的名称,以确保该行完全返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2019-12-12
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多