Расчет в случае, когда - PullRequest
0 голосов
/ 17 апреля 2019

Я использую SQL Server 2008, я пытаюсь выполнить некоторые вычисления внутри оператора case.

У меня есть проблема в последнем столбце [PM], любое другое предложение выполнить вычисления внутрислучай, когда с параметром даты: @StartDate и @EndDate?

DECLARE @StartDate date = '1/1/2019'
DECLARE @EndDate date = '4/30/2019'
DECLARE @StartDatePreviousYear date = DATEADD(YEAR, -1, @StartDate)
DECLARE @EndDatePreviousYear date = DATEADD(YEAR, -1, @EndDate)

SELECT
     DATENAME(month, [GL_DATEPIECE]) AS [MONTH]
    ,[et_region] AS [REGION]
    ,[e].[et_etablissement] AS [STORE CODE]
    ,[et_libelle] AS [STORE NAME]
    ,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA]
    ,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDatePreviousYear AND @EndDatePreviousYear THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA_AN],
(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL(sum(gl_totalttcdev)/count(distinct(GL_NUMERO)), 0) ELSE 0 END) AS [PM]

FROM [piece]
    LEFT OUTER JOIN [etabliss] AS [e] ON [piece].[gp_etablissement] = [e].[et_etablissement]
GROUP BY
     DATENAME(month, [GL_DATEPIECE])
    ,[et_region]
    ,[et_etablissement]
    ,[et_libelle]
ORDER BY
     [et_region] ASC
    ,[et_etablissement] ASC

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

использование NULLIF

DECLARE @StartDate date = '1/1/2019'
DECLARE @EndDate date = '4/30/2019'
DECLARE @StartDatePreviousYear date = DATEADD(YEAR, -1, @StartDate)
DECLARE @EndDatePreviousYear date = DATEADD(YEAR, -1, @EndDate)

SELECT
     DATENAME(month, [GL_DATEPIECE]) AS [MONTH]
    ,[et_region] AS [REGION]
    ,[e].[et_etablissement] AS [STORE CODE]
    ,[et_libelle] AS [STORE NAME]
    ,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA]
    ,SUM(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDatePreviousYear AND @EndDatePreviousYear THEN ISNULL([gl_totalttcdev], 0) ELSE 0 END) AS [CA_AN],
(CASE WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL(sum(gl_totalttcdev)/NULLIF(count(distinct(GL_NUMERO)),0), 0) ELSE 0 END) AS [PM]

FROM [piece]
    LEFT OUTER JOIN [etabliss] AS [e] ON [piece].[gp_etablissement] = [e].[et_etablissement]
GROUP BY
     DATENAME(month, [GL_DATEPIECE])
    ,[et_region]
    ,[et_etablissement]
    ,[et_libelle]
ORDER BY
     [et_region] ASC
    ,[et_etablissement] ASC
0 голосов
/ 17 апреля 2019

Ваш 'регистр' должен быть правильным, если ваш столбец GP_DATEPIECE является datetime. Но вы не можете делить на ноль, не забывайте это.

Попробуйте что-то вроде этого:

CASE 
WHEN count(distinct(GL_NUMERO)=0 then 0
WHEN [GP_DATEPIECE] BETWEEN @StartDate AND @EndDate THEN ISNULL(sum(gl_totalttcdev)/count(distinct(GL_NUMERO)), 0) ELSE 0 
END AS [PM]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...