1

我在 SQL Server 2008 数据库中有一个表,其中包含三列:dtindx_nmindx_val

当我运行时:

SELECT * 
FROM table1 a
WHERE a.indx_nm = 'ABQI' OR a.indx_nm = 'ACNACTR'
ORDER BY indx_nm, dt

我得到类似的东西(只需选择 3000 个值中的随机 8 个)

    # dt--------------indx_nm----------------indx_val
    2009-06-08---------ABQI------------------1001.25
    2009-06-09---------ABQI------------------1002.12
    2010-06-08---------ABQI------------------928.76
    2011-06-10---------ABQI------------------959.97
    2009-06-08--------ACNACTR----------------300.05
    2009-06-09--------ACNACTR----------------341.19
    2010-04-08--------ACNACTR----------------428.26
    2011-07-10--------ACNACTR----------------509.48

有什么方法可以返回一个看起来像的结果

    # dt---------indx_nm1-----indx_val1-------indx_nm2------indx_val2
    2009-06-08----ABQI------1001.2------------ACNACTR----------300.05
    2009-06-09----ABQI------1002.12 ----------ACNACTR----------341.19

本质上匹配索引号之间的共享日期,然后加入另一个indx_nm及其对应indx_val的结果?

*附录

所以我试图找到 和 之间的协ABQI方差ACNACTR。我知道我可以取整个indx_val1'的平均值和整体的平均值,index_val2但是有没有办法可以循环遍历整个 1000 多行的集合,以获取每个值indx_val1indx_val2输入 (xi-x)(yi- y) / n
我可能在 vba 上更容易做到这一点,但我认为它无法处理它(我有数百个我想确定协方差的 indx_nm)

4

1 回答 1

2

为了实现这一点,您可以GROUP BY dt使用聚合MAX()和的组合CASE返回正确的列,同时将带有 NULL 的多行折叠成单行。

SELECT 
  dt,
  MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1,
  MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1,
  MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2,
  MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2
FROM table1 a
GROUP BY dt
ORDER BY dt

这是一个演示:http ://sqlfiddle.com/#!6/2ec65/1

如果没有聚合,对于where或pair 的MAX()每个值,您最终会得到两行。然后,聚合选择 null 和非 null 值中的“最大”值,从而导致每个.dtABQIANACTRNULLMAX()dt

现在,如果您只想返回那些同时填充(没有s)的值dt,​​您可以将上面的内容包装在子查询中:indx_nmNULL

SELECT * FROM (
    SELECT 
      dt,
      MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1,
      MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1,
      MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2,
      MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2
    FROM table1 a
    GROUP BY dt
) indxs
WHERE
  /* Discard those rows where either pair is NULL */
  indx_nm1 IS NOT NULL
  AND indx_nm2 IS NOT NULL
ORDER BY dt

编辑哎呀,那个错误的WHERE条款不应该在那里。

于 2013-08-01T20:25:55.280 回答