Добавить результаты двух разных запросов вместе - PullRequest
0 голосов
/ 01 октября 2018

Я использую два разных запроса для получения данных.здесь я присоединился, используя union.

SELECT
  IPOD.StockCode
 ,SUM(IPOD.OrderQty) / 12 AS newAverage
FROM
  InvPurchaseOrderHeader AS IPOH
  INNER JOIN
    InvPurchaseOrderDetail AS IPOD
      ON
      IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID
WHERE
  IPOH.DocumentStatus = 1
  AND IPOH.DocumentDate >= (DATEADD(MONTH, -12, GETDATE()))
GROUP BY
  IPOD.StockCode
UNION
SELECT
  IPOD.StockCode
 ,SUM(IPOD.OrderQty) / 6 AS newAverage
FROM
  InvPurchaseOrderHeader AS IPOH
  INNER JOIN
    InvPurchaseOrderDetail AS IPOD
      ON
      IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID
WHERE
  IPOH.DocumentStatus = 1
  AND IPOH.DocumentDate >= (DATEADD(MONTH, -6, GETDATE()))
GROUP BY
  IPOD.StockCode;

, но запрос выше должен суммировать аналогичные записи, в настоящее время он дает такие результаты.

4846000001-M    20.000000
4846000001-M    40.000000
4846000001-S    10.000000
4846000001-S    20.000000

, но мне нужен набор данныхвот так

4846000001-M    60.000000
4846000001-S    30.000000

Более того, мне нужно разделить каждое полученное значение строки на 3

Окончательный набор данных должен выглядеть следующим образом.

4846000001-M    20.000000
4846000001-S    10.000000

как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Вы можете просто использовать функцию sum(), используя подзапрос, но агрегация условий лучше, чем ответ sir @ gordon

 select  t.StockCode,sum(newAverage)/3   from
(
select IPOD.StockCode, SUM(IPOD.OrderQty)/12 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -12, GETDATE()))
    GROUP BY IPOD.StockCode

    union 

    select IPOD.StockCode, SUM(IPOD.OrderQty)/6 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -6, GETDATE()))
    GROUP BY IPOD.StockCode)

) as t group by t.StockCode
0 голосов
/ 01 октября 2018

мы также можем использовать avg () функцию в этой

select  t.StockCode,avg(newAverage)   from
(
select IPOD.StockCode as stockcode, SUM(IPOD.OrderQty)/12 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -12, GETDATE()))
    GROUP BY IPOD.StockCode

    union 

    select IPOD.StockCode as stockcode, SUM(IPOD.OrderQty)/6 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -6, GETDATE()))
    GROUP BY IPOD.StockCode)

) as t group by t.StockCode

, вы также можете использовать с Clause

with data as
(
select IPOD.StockCode as stockcode, SUM(IPOD.OrderQty)/12 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -12, GETDATE()))
    GROUP BY IPOD.StockCode

    union 

    select IPOD.StockCode as stockcode, SUM(IPOD.OrderQty)/6 as newAverage from 

    InvPurchaseOrderHeader IPOH 
    INNER JOIN InvPurchaseOrderDetail IPOD on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 

    where IPOH.DocumentStatus = 1 AND IPOH.DocumentDate >= (DATEADD(MONTH, -6, GETDATE()))
    GROUP BY IPOD.StockCode)

),select stockcode,avg(newAverage) from data group by stockcode;
0 голосов
/ 01 октября 2018

Вам не нужно два запроса.Вы можете получить отдельные столбцы как:

select IPOD.StockCode,
       sum(case when IPOH.DocumentDate >= dateadd(month, -12, getdate()) then IPOD.OrderQty end)/12 as newAverage_12, 
       sum(case when IPOH.DocumentDate >= dateadd(month, -6, getdate()) then IPOD.OrderQty end)/6 as newAverage_6    
from InvPurchaseOrderHeader IPOH inner join
     InvPurchaseOrderDetail IPOD
     on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 
where IPOH.DocumentStatus = 1 
group by IPOD.StockCode;

Вы можете легко сложить их вместе и разделить на 3.

РЕДАКТИРОВАТЬ:

Итак, ответ на ваш конкретный вопросэто:

select IPOD.StockCode,
       (sum(case when IPOH.DocumentDate >= dateadd(month, -12, getdate()) then IPOD.OrderQty end)/12 + 
        sum(case when IPOH.DocumentDate >= dateadd(month, -6, getdate()) then IPOD.OrderQty end)/6
       ) / 3
from InvPurchaseOrderHeader IPOH inner join
     InvPurchaseOrderDetail IPOD
     on IPOH.InvPurchaseOrderHeaderID = IPOD.InvPurchaseOrderHeaderID 
where IPOH.DocumentStatus = 1 
group by IPOD.StockCode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...