关于查询引用单列多行值的问题
本帖最后由 u013985466 于 2014-04-26 22:27:35 编辑
              
              最近,遇到一个麻烦的问题:一个绩效考核工程,其绩效项目有将近40个,每个绩效项目分数(表2)的得出,来源于原始指标(表1)的值(有将近100个原始指标类别,每个绩效项目可能引用其中3-5个指标的值)。传统的做法是,有多少个原始指标类别,就建立多少列,这样引用列值计算就没有丝毫困难。但是,本工程由于种种原因,将所有类别的指标实际值,统一存放在表1的列index_value中,这就涉及表2的列eva_score需要引用表1对应年、月、部门以及多个对应指标的实际值。有如下解决思路,以计算项目1在2014年4月的项目分数为例,请各位兄弟评析一下:
  解决思路1:查询表1中指标1、指标2、指标3在2014年4月的原始数值,分别赋予其列名为指标1、指标2、指标3,然后带入表2的“eva_score=(指标1实际值+指标2实际值)/指标3实际值”运算公式,时间和部门的匹配通过where子句来控制。
 解决思路2:大致等同于思路1,不过是利用公用表达式来实现。
-------------------------------------------------------
表1				
index_name	m_year	m_month	dep_name	index_value
指标1	2014	4	A部门	0.01
指标1	2014	4	B部门	0.03
指标1	2014	4	C部门	0.02
指标1	2014	4	D部门	0.04
指标1	2014	4	E部门	0.06
指标2	2014	4	A部门	0.133
指标2	2014	4	B部门	0.266
指标2	2014	4	C部门	0.185
指标2	2014	4	D部门	0.165
指标2	2014	4	E部门	0.178
指标3	2014	4	A部门	0.458
指标3	2014	4	B部门	0.666
指标3	2014	4	C部门	0.782
指标3	2014	4	D部门	0.638
指标3	2014	4	E部门	0.618
-----------------------------------------------------------------
表2
eva_item	m_year	m_month	dep_name	eva_score		
项目1	2014	4	A部门			
项目1	2014	4	B部门			
项目1	2014	4	C部门			
项目1	2014	4	D部门			
项目1	2014	4	E部门			
计算规则:项目1的	eva_score=(指标1实际值+指标2实际值)/指标3实际值,需要引用对应年、月、部门以及对应指标的实际值,完成混合运算
------------------------------------------------------------------
相关测试数据如下:由于无法实现数据库记录导出为insert into样式的sql脚本,请参照前面的文本作为测试数据。
CREATE TABLE [dbo].[table1](
	[index_name] [nvarchar](255) NULL,
	[m_year] [float] NULL,
	[m_month] [float] NULL,
	[dep_name] [nvarchar](255) NULL,
	[index_value] [float] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[table2](
	[eva_item] [nvarchar](255) NULL,
	[m_year] [float] NULL,
	[m_month] [float] NULL,
	[dep_name] [nvarchar](255) NULL,
	[eva_score] [float] NULL
) ON [PRIMARY]
GO
------解决方案--------------------表1 中全部是项目1的数据吗? 
表2 的列eva_item 与表1 有什么关联没?
------解决方案--------------------你想要的结果是怎样的呢
------解决方案--------------------
行专列确实是一个好办法,不过,100多个指标,稍微要多写一点代码。
------解决方案--------------------如果行转列,则可能出现100多个指标列,总觉得表的可读性和可维护性较差,并且在每个绩效项目分数的计算公式中,只需要引用几个类别的指标数值。因此,还是希望保留现有的数据表结构。
那就写子查询把,比如:
select 
(select SUM(xxx) from 表 where index_name in ('指标1','指标2')) /
select SUM(xxx) from 表 where index_name in ('指标3'))
from tb
------解决方案--------------------SQL Server 2000桌面引擎(MSDE 2000)。
这是一个可以打包到你的安装程序里,你百度一下,查查资料看看怎么打进去,都是比简单操作。
------解决方案--------------------
SQL Server 2000桌面引擎(MSDE 2000)。
这是一个可以打包到你的安装程序里,你百度