Я пытаюсь обновить программное обеспечение 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 программного обеспечения
Тег dbms, который вы используете. (Код продукта определен.) – jarlh
Я использую SSMS –
SSMS не является dbms, вы используете SQL Server правильно. Но видя, что coalesce «не работает» - это означает, что ценность, которую он получает, не является NULL, как вы ожидаете, но может быть пустой строкой или чем-то еще. Поэтому попробуйте выбрать само значение без COALESCE и посмотреть, что вы получаете. –