SQL为按行分组的每组行划分两列值

时间:2014-01-12 19:50:51

标签: sql sql-server subquery time-series

目前,我有一张表格,其中包含以下三个

变量:company_name,data_date和price。

表中包含的数据具有时间序列性质。对于每个公司名称,都有包含company_name,price和两个日期之一'20011231''20111230'的行。

此数据集中没有重复项。我想帮助提出一个查询,该查询将日期'20111230'的价格除以每个company_name组的日期'20011231'的价格。

此外,如果没有包含两个日期的行,我想删除所有company_name行。

对于第一个查询,我尝试了以下代码,但它给出了以下错误:“操作数数据类型varchar对除运算符无效。”

SELECT (SELECT prc
        FROM A_returns
        WHERE [date] = '20111230'
        GROUP BY [comnam], [PRC])/
       (SELECT prc
        FROM A_returns
        WHERE [date] = '20111230'
        GROUP BY [comnam], [PRC]) 
FROM A_returns

要删除上述错误,我尝试将price列中的值转换为浮点数,但我收到与以前相同的错误。

UPDATE A_returns
SET prc = CAST(prc AS float)
GO

1 个答案:

答案 0 :(得分:1)

你可以做这样的事情

SELECT t1.comnam, t1.prc / t2.prc AS price_ratio
  FROM A_returns t1 JOIN A_returns t2
    ON t1.comnam = t2.comnam
   AND t1.date = '20111230'
   AND t2.date = '20111231'

示例输出:

|   COMNAM |    PRICE_RATIO |
|----------|----------------|
| company1 | 1.052631578947 |
| company2 | 0.909090909091 |

这是 SQLFiddle 演示

删除没有两个日期记录的公司的行

DELETE t1 
  FROM A_returns t1 JOIN
(
    SELECT comnam
    FROM A_returns
    GROUP BY comnam
   HAVING COUNT(*) = 1

) t2
ON t1.comnam = t2.comnam

这是 SQLFiddle 演示