复杂的SQL查询,由求和函数确定的比率的pos/neg/zero计数

复杂的SQL查询,由求和函数确定的比率的pos/neg/zero计数,sql,sql-server,Sql,Sql Server,我们将收入差异计算为2012年第一季度至第四季度和2013年第一季度至第四季度的百分比变化。然后我们需要总的积极,总的消极,总的没有变化。所有数据都在一个表中。这需要完全使用SQL 我已经成功地获得了2012年的结果,然后是2013年的结果,但似乎无法让他们回到同样的记录 SELECT ID_FIELD, sum( Receipts_Total ) FROM QR_Dom WHERE quarter LIKE '%2012%' GROUP BY ID_FIELD; 及 最后,我需要执行此

我们将收入差异计算为2012年第一季度至第四季度和2013年第一季度至第四季度的百分比变化。然后我们需要总的积极,总的消极,总的没有变化。所有数据都在一个表中。这需要完全使用SQL

我已经成功地获得了2012年的结果,然后是2013年的结果,但似乎无法让他们回到同样的记录

SELECT ID_FIELD, sum( Receipts_Total ) 
FROM QR_Dom 
WHERE quarter LIKE '%2012%' 
GROUP BY ID_FIELD;

最后,我需要执行此计算,然后计算正/负/零,然后除以总计数:

(2013 Receipts_Total - 2012 Receipts_Total) / 2012 Receipts_Total
我当前的硬编码id查询如下所示:

SELECT ID_FIELD, (((SELECT SUM(Receipts_Total) 
                    FROM QR_Dom 
                    WHERE quarter LIKE '%2013%' 
                          AND ID_FIELD = 10001 
                    GROUP BY ID_FIELD)
                 - (SELECT SUM(Receipts_Total) 
                    FROM QR_Dom 
                    WHERE quarter LIKE '%2012%' 
                          AND ID_FIELD = 10001 
                    GROUP BY ID_FIELD))
                 / (SELECT SUM(Receipts_Total) 
                    FROM QR_Dom 
                    WHERE quarter LIKE '%2012%' 
                          AND ID_FIELD = 10001 
                    GROUP BY ID_FIELD) ) AS RATIO 
FROM QR_Dom 
WHERE ID_FIELD = 10001 
GROUP BY ID_FIELD
您可以使用案例陈述来查找确切的年份:

SELECT (CASE WHEN quarter LIKE '%2012%' THEN 2012
             WHEN quarter LIKE '%2013%' then 2013
        END) as yr, ID_FIELD, sum( Receipts_Total )
FROM QR_Dom
WHERE quarter LIKE '%2012%' or quarter LIKE '%2013%'
GROUP BY (CASE WHEN quarter LIKE '%2012%' THEN 2012
               WHEN quarter LIKE '%2013%' then 2013
          END), ID_FIELD;
这应该可以在MySQL和SQL Server中使用

编辑:

如果需要差异,可以使用条件聚合和算术:

SELECT ID_FIELD,
       (SUM(CASE WHEN quarter LIKE '%2013%' THEN Receipts_Total ELSE - Receipts_TOTAL
            END) / 
        SUM(CASE WHEN quarter LIKE '%2012%' THEN Receipts_Total
            END)
       )
FROM QR_Dom
WHERE quarter LIKE '%2012%' or quarter LIKE '%2013%'
GROUP BY ID_FIELD;

您能定义季度的类型吗?您使用的是MySQL还是SQL SErver?这些是不同的数据库,问题应仅标记为您实际使用的数据库。Quarter是一个varchar,即2012Q1、2012Q2。。。等等。我使用的是SQLServer。这让我有了一部分,但ID字段是硬编码的…选择ID\u字段,从QR_Dom中选择SumReceives_Total,其中季度类“%2013%”,ID_字段=10001按ID_字段分组-从QR_Dom中选择SumReceives_Total,其中季度类“%2012%”,ID_字段=10001按ID_字段分组,作为QR_Dom中的比率ID_字段=10001按ID_字段分组;我怀疑它在SQL Server中是否有效,因为您有一个列ID_字段不在GROUP BY或AGGRATE函数中。是的,很好,这将返回每个ID的年度总数。现在我需要从2013年总数中减去2012年总数,除以2012年总数2013_总数-2012_总数/2012_总数*100,然后计算出正的数字,负数或介于1/-1之间
SELECT ID_FIELD,
       (SUM(CASE WHEN quarter LIKE '%2013%' THEN Receipts_Total ELSE - Receipts_TOTAL
            END) / 
        SUM(CASE WHEN quarter LIKE '%2012%' THEN Receipts_Total
            END)
       )
FROM QR_Dom
WHERE quarter LIKE '%2012%' or quarter LIKE '%2013%'
GROUP BY ID_FIELD;