复杂SQL查询,由SUM函数确定的比率的pos / neg /零计数

时间:2014-05-05 22:36:00

标签: 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;

SELECT ID_FIELD, sum( Receipts_Total ) 
FROM QR_Dom 
WHERE quarter LIKE '%2013%' 
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

1 个答案:

答案 0 :(得分:0)

您可以使用case语句查找确切的年份:

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;