如何为Item1和Item1 +'char'求和

时间:2013-04-18 14:08:41

标签: sql-server tsql

我有一个关于SQL问题的问题。

例如,我有一个表,如下所示:

|  ITEM  |  VALUE  |
|A0001   |   3     |
|A0001   |   2     |
|A0002   |   2     |
|A0003   |   7     |
|A0003   |   3     |
|A0003U  |   2     |

如您所见,一个Item可以有值。所以我已经完成的是SUM()附加到每个项目的所有值,以获得他的值的总和

我现在要做的是添加附加到项目的值以及此项目+'U'

例如,商品 A0003U 价值总和

7(项目第1行)+ 3(项目第2行)+ 2(项目第1行+'U') = 12

我知道我可以使用RIGHT(Item,1)函数,如果它以'U'结尾将返回'U',但我不知道如何进行所有计算。

编辑:

结果应该是:

|  ITEM  |  VALUE  |
|A0001   |   5     |
|A0002   |   2     |
|A0003   |   12     |

2 个答案:

答案 0 :(得分:6)

这将通过获取ITEM列的前5个字符并按它们分组来汇总值。这将包括以U

结尾的项目
Select Left(ITEM,5),
        SUM(VALUE)
From Table
Group by Left(ITEM,5)

修改

假设U始终是最后一个字符并且只出现一次,那么您可以使用此备选方案:

Select  Case 
            When CHARINDEX('U', ITEM) > 0 Then LEFT(ITEM, CHARINDEX('U', ITEM)-1)
            Else ITEM
        End,
        SUM(VALUE)
From Table
Group by    Case 
            When CHARINDEX('U', ITEM) > 0 Then LEFT(ITEM, CHARINDEX('U', ITEM)-1)
            Else ITEM
            End

答案 1 :(得分:2)

在OP添加预期的结果集之前,我过度思考了这个问题。然而,如果需要的输出将是这样的查询:

|  ITEM  |  VALUE  |
|A0001   |   5     |
|A0002   |   2     |
|A0003   |   10    |
|A0003U  |   12    |

它可能会变得有用:

SELECT 
   a.ITem
   ,CASE 
      WHEN RIGHT(a.ITEM,1)='U' 
        THEN SUM(b.VALUE) 
        ELSE SUM(a.VALUE) 
      END AS VALUE
FROM table1 a
LEFT JOIN table1 b 
  ON a.ITEM = b.ITEM + 'U' 
  OR (RIGHT(a.ITEM,1)='U' AND a.ITEM = b.ITEM)
GROUP BY a.ITem

<强> SQLFiddle DEMO

修改

查询问题的简化(实际)版本:

Select 
  CASE 
    WHEN RIGHT(ITEM,1) = 'U' THEN SUBSTRING(ITEM,0,LEN(ITEM)) 
    ELSE ITEM 
  END AS ITEM
  ,SUM(VALUE) as VALUE
From Table1
GROUP BY 
   CASE 
    WHEN RIGHT(ITEM,1) = 'U' THEN SUBSTRING(ITEM,0,LEN(ITEM)) 
    ELSE ITEM 
   END

<强> SQLFiddle DEMO