【问题标题】:SQL Dividing two column values for each set of rows grouped by a columnSQL为按列分组的每组行划分两列值
【发布时间】:2014-01-31 12:02:56
【问题描述】:

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

变量:公司名称、数据日期和价格。

表中包含的数据具有时间序列性质。对于每个公司名称,都有包含公司名称、价格和两个日期之一的行,'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

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

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

【问题讨论】:

  • 您对 prc 列使用什么数据类型?试投:CAST(prc as money)

标签: sql sql-server subquery time-series


【解决方案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'

样本输出:

|通讯 | PRICE_RATIO | |------------|----------------| |公司1 | 1.052631578947 | |公司2 | 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演示

【讨论】:

  • 我尝试了第一个查询,但它给了我和以前一样的错误。我尝试将价格转换为浮动,但它仍然不起作用。我使用的代码在 OP 中。
  • prc 列的数据类型是什么。你能显示确切的表架构吗?
  • 由于某种原因,该列的数据类型是 varchar,但我将其更改为 float。查询现在运行没有错误,但由于某种原因没有返回任何值。
猜你喜欢
  • 2014-08-20
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多