我有一个关于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 |
答案 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 强>