【问题标题】:SQL Server : how to do mathematical computation for the values in one columnSQL Server:如何对一列中的值进行数学计算
【发布时间】:2019-02-06 05:02:45
【问题描述】:

我已经写了这个查询:

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

有什么建议吗?

【问题讨论】:

  • 您可以添加一个行号并执行自联接或 cte,将行与行进行比较 - 1。(由于您使用的是旧版本的 SQL,因此您无法使用前导和滞后。)跨度>

标签: sql-server sql-server-2005 ssms


【解决方案1】:

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

【讨论】:

  • 非常感谢!上述解决方案给出了预期的输出。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多