下面是一个例子查询,返回指定的结果:
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType = 29 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType = 1 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType = 15 THEN f.UnitCost END) AS ContFee
FROM dbo.Fee f
GROUP BY f.CaseId
在这个答案的查询做了几个假设,其中一些很可能是错误的。例如,它假定dbo.Fee
表中的FeeType
列是整数数据类型。
与FLOAT数据类型进行等式比较可能会产生问题,因为这是十进制值的近似值。
对于FeeType
列,它似乎是一个离散的整数值,我们通常使用整数数据类型,而不是IEEE FLOAT。
对于“成本”值,我们通常使用DECIMAL数据类型,或者在SQL Server中,我们可以使用MONEY数据类型,而不是IEEE FLOAT。
FLOAT类型上的平等比较可能是有问题的......唯一的好办法是找出FLOAT近似值与整数或小数值之间的差异,并考虑它们“平等”。
这里有一个方法做比较与FLOAT,最多允许中值0.01的区别...
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType > 28.99 AND f.feeType < 29.01 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType > 0.99 AND f.feeType < 1.01 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType > 14.99 AND f.feeType < 15.01 THEN f.UnitCost END) AS ContFee
FROM dbo.Fee f
GROUP BY f.CaseId
一个更好的解决将是FeeType
列的数据类型更改为整数类型。
若要返回“AdminFee加SubFee”,只需将另一个SUM(表达式)添加到SELECT列表;如果FeeType为29或1,则此表达式将返回UnitCost。
SELECT f.CaseId
, SUM(CASE WHEN f.FeeType > 28.99 AND f.feeType < 29.01 THEN f.UnitCost END) AS AdminFee
, SUM(CASE WHEN f.FeeType > 0.99 AND f.feeType < 1.01 THEN f.UnitCost END) AS SubFee
, SUM(CASE WHEN f.FeeType > 14.99 AND f.feeType < 15.01 THEN f.UnitCost END) AS ContFee
, SUM(CASE
WHEN (f.FeeType > 28.99 AND f.feeType < 29.01)
OR (f.FeeType > 0.99 AND f.feeType < 1.01) THEN f.UnitCost END) AS AdminPlusSub
FROM dbo.Fee f
GROUP BY f.CaseId
看起来您正在尝试做某种关键点。你使用的是什么DBMS? – 2014-09-12 14:15:45
输入和输出之间的关系是什么?你实际上没有描述你在任何地方试图做什么...... – 2014-09-12 14:16:11
你真的不能提出一个更好的问题标题,那么你张贴什么?这并不能解释你想要做什么。另外,你在哪里得到名为'AdminFee','SubFee','ContFee',我们不会猜测这些东西。如果你有一张储存了这些名字的表格,那么就发布这些详细信息。 – Taryn 2014-09-12 14:18:48