1

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

例如,我有一个像这样的

| 项目 | 价值 |
|A0001 | 3 |
|A0001 | 2 |
|A0002 | 2 |
|A0003 | 7 |
|A0003 | 3 |
|A0003U | 2 |

如您所见,一个项目可以有可能的值。所以我已经做的是SUM()对每个项目附加的所有价值,以获得他的价值之和

我现在想要做的是添加附加到一个项目和这个项目+'U'的值

例如,项目A0003U的价值总和将是

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

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

编辑:

结果集应该是:

| 项目 | 价值 |
|A0001 | 5 |
|A0002 | 2 |
|A0003 | 12 |
4

2 回答 2

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
于 2013-04-18T14:13:21.220 回答
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 演示

编辑:

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

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 演示

于 2013-04-18T14:28:40.343 回答