SQL Server: как выполнять математические вычисления для значений в одном столбце - PullRequest
0 голосов
/ 31 августа 2018

Я написал этот запрос:

SELECT 
    'APRIL _DATA_PASSED Only' AS 'ONE MONTH Audit_name',
   SUM(count2) AS Audit_count 
FROM
    (SELECT
         vCCSF.ClientName, 
         s.Name as SupplierName, 
         f.name as firstname, 
         vCCSF.CategoryName,
         r.Passed as passed,
         MONTH(CONVERT(DATE, r.CreateDate)) AS month, 
         YEAR(CONVERT(DATE, r.CreateDate)) AS year,
         source.name, 
         COUNT(*) AS count2
     FROM
         notr n
     JOIN
         NotrResult nr ON n.id = nr.NotrId
     JOIN
         results r ON r.NotrResultId = nr.id
     JOIN
         ProductLineFacilityMap plfm ON n.ProductLineFacilityMapId = plfm.id
     JOIN
         Facility f ON plfm.FacilityId = f.ID
     JOIN
         vClientCategorySubcategoryFilters vCCSF ON vCCSF.ProductLineId = plfm.ProductLineId
     JOIN
         Parameter p ON r.ParameterId = p.Id
     JOIN
         Supplier s ON f.SupplierId = s.id
     JOIN
         source ON p.SourceId = source.id
     WHERE
         n.Active = 1  
         AND n.Completed = 1  
         AND r.Active = 1 
         AND r.Passed = 1
         AND r.CreateDate BETWEEN '2018-04-01' AND '2018-04-30'
     GROUP BY
         vCCSF.ClientName, s.Name, f.name, 
         vCCSF.CategoryName, r.Passed, source.name, 
         MONTH(CONVERT(DATE, r.CreateDate)), 
         YEAR(CONVERT(DATE, r.CreateDate))
     HAVING
         vCCSF.ClientName LIKE 'Mc%' 
         AND s.name LIKE 'Ronpak%'   
         AND vCCSF.CategoryName LIKE 'Paper Bag%'  
         AND source.name = 'Conversion') AS tb

UNION ALL

SELECT 
    'APRIL _Conversion_DATA_BOTH' AS 'ONE MONTH Audit_name',
    SUM(count1) AS Audit_count
FROM
    (*same query as above, excluding this filter : r.Passed =1*) AS tb2

UNION ALL

SELECT 
    'APRIL _Conversion_DATA_BOTH' AS 'ONE MONTH Audit_name',
    SUM(count1) AS Audit_count
FROM
    (**same as above*
        AND r.Passed = 1
     GROUP BY
         *same as above*
     HAVING
         *same as above but changed the source filter*
         AND source.name = 'Raw Materials') AS tb3

UNION ALL

SELECT 
    'APRIL _Raw Materials_DATA_BOTH' AS 'ONE MONTH Audit_name',
    SUM(count1) AS Audit_count
FROM
    (*same query as above, excluding this filter : r.Passed = 1*
     AND source.name = 'Raw Materials') AS tb4

Возвращается этот вывод:

|ONE MONTH Audit_name|      |Audit_count|  
|APRIL _Conversion_McDonalds_Ronpak_Paper Bags_PASSED Only|   |124|  
|APRIL _Conversion_McDonalds_Ronpak_Paper Bags_BOTH|          |150|  
|APRIL_Raw Materials_McDonalds_Ronpak_Paper Bags_PASSED Only| |16|  
|APRIL _Raw Materials_McDonalds_Ronpak_Paper Bags_BOTH|       |70|  

Задача

В поисках решения, где я мог бы выполнить деление

  1. первый ряд / второй ряд
  2. третий ряд / четвертый ряд

UNION ALL используется намеренно для получения всех результатов на одной странице, но было бы замечательно, если бы решение было таким образом

Conversion        Raw Material                 Overall
(PASSED only /    ( PASSED only / BOTH)        SUM(Conversion+ Raw Material   
                                                )passed /                                              
                                                  BOTH conv and raw

Есть предложения, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018
DECLARE @AprilConversionPass DECIMAL(11,2)
DECLARE @AprilConversionBOTH DECIMAL(11,2)
DECLARE @AprilRawMaterialPass DECIMAL(11,2)
DECLARE @AprilRawMaterialBOTH DECIMAL(11,2)

SET @AprilConversionPass = (
SELECT 
    'APRIL _Conversion_DATA_BOTH' AS 'ONE MONTH Audit_name',
    SUM(count1) AS Audit_count
FROM
    (*same query as above, excluding this filter : r.Passed =1*) AS tb2
);
SET @AprilConversionBOTH () ; and so on


SELECT '1. _Conversion_McDonalds_Ronpak_Paper Bags_PASSED Only' AS 'SIX MONTH Audit_name',
 @AprilConversionPass AS Audit_count
union all
SELECT '2. _Conversion_McDonalds_Ronpak_Paper Bags_BOTH' AS 'SIX MONTH Audit_name',
 @AprilConversionBOTH AS Audit_count and so on
0 голосов
/ 31 августа 2018

Просто создайте 4 переменные для каждого расчета. И сохраняйте результаты в каждой переменной на основе вашего запроса. И после этого вы можете использовать эти переменные в расчете.

Просто приведите один пример, как показано ниже.

DECLARE @AprilConversionPass DECIMAL(11,2)

SET @AprilConversionPass = (
SELECT 
    'APRIL _Conversion_DATA_BOTH' AS 'ONE MONTH Audit_name',
    SUM(count1) AS Audit_count
FROM
    (*same query as above, excluding this filter : r.Passed =1*) AS tb2
)

Таким образом, вы можете установить все 4 переменные и затем использовать их в своем запросе выбора согласно математической операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...