Функция SQL Sum с инструкцией When- Case

#sql #sql-server #sum

#sql #sql-сервер #сумма

Вопрос:

Я использую функцию SUM в инструкции when case, когда я сделал неправильное решение только [TOTALTesellum] . Что я могу сделать, вот мой код SQL

 SELECT  CUS.NAME  AS [Tedarikçi],  GOOD.NAME AS [Ürün] ,
  SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END) AS[Haftalık Sipariş],
  SUM(CASE WHEN PDET.COUNT IS NOT NULL THEN  PDET.COUNT ELSE 0 END ) AS [Toplam Sipariş],
  SUM(CASE WHEN TES.TESELLUMDATE IS NOT NULL THEN TES.ORDERAMOUNT ELSE 0 END) AS[TOTALTesellum],
 -- SUM(TES.ORDERAMOUNT) AS [Toplam Tesellum],


 (CASE WHEN  SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END) > SUM(PDET.COUNT) THEN  SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END) - SUM(PDET.COUNT) ELSE 0 END) AS [Fazlalık] ,

 (CASE WHEN  SUM(PDET.COUNT) > SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END)  THEN  SUM(PDET.COUNT) - SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END)  ELSE 0 END) AS [Eksiklik] 

 --ORDER BY  TES.TESELLUMDATE  DESC AS [asxasxa]

FROM     dbo.IDTESELLUMDATA  TES INNER JOIN
                  dbo.IDLANDPRELOADS PRE ON TES.SUPPLIERID = PRE.EXPORTERCUSTOMERID 
                  INNER JOIN
                  dbo.IDLANDPRELOADDETAILS  PDET ON  PDET.PRELOADID = PRE.ID 

                  INNER JOIN
                  dbo.IDCUSTOMERS CUS ON TES.SUPPLIERID = CUS.ID AND 
                  PRE.EXPORTERCUSTOMERID = CUS.ID 
                  INNER JOIN 
                  dbo.IDLANDGOODSDEFINITIONS GOOD ON TES.GOODID = GOOD.ID AND PDET.GOODSID = GOOD.ID

                   GROUP BY CUS.NAME  , GOOD.NAME
  

Комментарии:

1. Выражения Case, а не операторы case. (Выражение case возвращает значение.)

Ответ №1:

Что я понимаю из вашего запроса — просто переформатируйте и перестройте скрипт, это может решить вашу проблему

 SELECT M.[Ürün],
       M.[Haftalık Sipariş], 
       M.[Toplam Sipariş],
       M.[TOTALTesellum],
       CASE WHEN  M.[Haftalık Sipariş] > M.[PDET COUNT] THEN M.[Haftalık Sipariş] - M.[PDET COUNT] ELSE 0 END AS [Fazlalık],
       CASE WHEN  M.[PDET COUNT] > M.[Haftalık Sipariş]  THEN M.[PDET COUNT]-M.[Haftalık Sipariş]  ELSE 0 END AS [Eksiklik]  
FROM(
   SELECT  CUS.NAME  AS [Tedarikçi],  GOOD.NAME AS [Ürün] ,
           SUM(CASE WHEN PDET.ORDERDATE <= GETDATE() THEN PDET.COUNT ELSE 0 END) AS[Haftalık Sipariş],
           SUM(CASE WHEN PDET.COUNT IS NOT NULL THEN  PDET.COUNT ELSE 0 END ) AS [Toplam Sipariş],
           SUM(DISTINCT CASE WHEN TES.TESELLUMDATE IS NOT NULL THEN TES.ORDERAMOUNT ELSE 0 END) AS[TOTALTesellum],
           SUM(PDET.COUNT) AS [PDET COUNT]
    FROM dbo.IDTESELLUMDATA  TES 
    INNER JOIN dbo.IDLANDPRELOADS PRE ON TES.SUPPLIERID = PRE.EXPORTERCUSTOMERID 
    INNER JOIN dbo.IDLANDPRELOADDETAILS  PDET ON  PDET.PRELOADID = PRE.ID 
    INNER JOIN dbo.IDCUSTOMERS CUS ON TES.SUPPLIERID = CUS.ID AND PRE.EXPORTERCUSTOMERID = CUS.ID 
    INNER JOIN dbo.IDLANDGOODSDEFINITIONS GOOD ON TES.GOODID = GOOD.ID AND PDET.GOODSID = GOOD.ID
    GROUP BY CUS.NAME, GOOD.NAME
)M
  

Комментарии:

1. Привет, не могли бы вы, пожалуйста, удалить все комментарии, кроме последних, чтобы они выглядели хорошо