2014-09-12 34 views
-4

你好在SQL数据库dbo.Fee我我想写一个查询,但似乎可以想办法做到这一点

 
----------------------------------------- 
Id  | CaseId | FeeType | UnitCost 
----------------------------------------- 
1017796 | 2697789 |  29 |  50 
1018167 | 2697789 |  1 |  150 
1019493 | 2697789 |  15 |  30 
----------------------------------------- 

我想写一个sql查询,我想它显示作为

 
----------------------------------------- 
CaseId | AdminFee | SubFee | ContFee 
----------------------------------------- 
2697789 |  50 | 150 |  30 
----------------------------------------- 

任何帮助将正在使用的MS SQL Server,这可能是你想要wgat理解 感谢

+1

看起来您正在尝试做某种关键点。你使用的是什么DBMS? – 2014-09-12 14:15:45

+0

输入和输出之间的关系是什么?你实际上没有描述你在任何地方试图做什么...... – 2014-09-12 14:16:11

+0

你真的不能提出一个更好的问题标题,那么你张贴什么?这并不能解释你想要做什么。另外,你在哪里得到名为'AdminFee','SubFee','ContFee',我们不会猜测这些东西。如果你有一张储存了这些名字的表格,那么就发布这些详细信息。 – Taryn 2014-09-12 14:18:48

回答

3

下面是一个例子查询,返回指定的结果:

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 
+2

请勿编辑问题以向其添加解决方案。 – Taryn 2014-09-12 14:22:14

+0

它显示 – 2014-09-12 14:33:42

+0

@SavioDias:欢迎来到StackOverflow社区!很可能,您有我的示例查询不满足的其他要求。但是不要猜测这些要求是什么(例如,额外的费用类型),对于该案例的所有UnitCost总数等。 – spencer7593 2014-09-12 14:35:37

2

假设你。

select 
    caseid, 
    max(adminfee) AS AdminFee, 
    max(subfee) as Subfee, 
    max(contfee) as ContFee 
from (
    select 
    caseid, 
    case when FeeType = 29 Then UnitCost End as AdminFee, 
    case when FeeType = 1 Then UnitCost End as SubFee, 
    case when FeeType = 15 Then UnitCost End as ContFee 
    from dbo.fee 
) a 
group by caseid 

Sample SQL Fiddle

+0

对MAX和SUM好奇吗?大多数机构都乐意收取多项费用并加起来。否则,做得好。 – 2014-09-12 14:21:48

+0

@JonathanLeffler好点。我只是选择max,因为我认为只有一种特定caseID的费用。看看spencer7593的答案,我意识到总结可能更合适,并且不需要使用max来避免空值。 – jpw 2014-09-12 14:23:26

+0

输出显示| 2697789 | NULL | 150 | NULL | – 2014-09-12 14:40:37

相关问题