SQL服务器:如何对一列中的值进行数学计算

SQL Server : how to do mathematical computation for the values in one column

我写了这个查询:

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

有什么建议吗?

只需为每个计算创建 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 个变量,然后根据数学运算在 select 查询中使用。

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