我很抱歉那里有那种含糊不清的标题,但我不认为有一种简单的方法来解释我在这里要做的事情。 我在SQL数据库中有下表:
╔═══════╦══════════════════════════╦════════════╦════════════════╦════════════════╦════════════════╗
║ ID ║ Short Name ║ Day ║ CSFB ║ SomeNumberHere ║ DCR ║
║ 58144 ║ PERSVN_L26_C_1 ║ 06/10/2014 ║ 588 ║ 588 ║ 15727 ║
║ 58145 ║ PERSVN_L26_C_1 ║ 07/10/2014 ║ 587 ║ 587 ║ 16733 ║
║ 58146 ║ PERSVN_L18_C_1 ║ 08/10/2014 ║ 640 ║ 640 ║ 15109 ║
║ 58250 ║ PETERLORANGESVEI_L18_C_1 ║ 12/10/2014 ║ 53 ║ 53 ║ 2765 ║
║ 58251 ║ PHILIPPEDERSEN_L08_A2_1 ║ 03/10/2014 ║ 24 ║ 24 ║ 1003 ║
╚═══════╩══════════════════════════╩════════════╩════════════════╩════════════════╩════════
我想在此表中创建一个额外的行,如果短名称包含 L26 ,则将通过添加DCR + CSFB行号来计算,DCR - CSFB如果短名称包含 L18 和DCR / CSFB如短名称包含 L08 。
结果如下:
╔═══════╦══════════════════════════╦═════════════╦════════════╦═══════╦════════════════╦═══════╗
║ ID ║ Short Name ║ Calculation ║ Day ║ CSFB ║ SomeNumberHere ║ DCR ║
║ 58144 ║ PERSVN_L26_C_1 ║ {CSFB+DCR} ║ 06/10/2014 ║ 588 ║ 588 ║ 15727 ║
║ 58145 ║ PERSVN_L26_C_1 ║ {CSFB+DCR} ║ 07/10/2014 ║ 587 ║ 587 ║ 16733 ║
║ 58146 ║ PERSVN_L18_C_1 ║ {CSFB-DCR} ║ 08/10/2014 ║ 640 ║ 640 ║ 15109 ║
║ 58250 ║ PETERLORANGESVEI_L18_C_1 ║ {CSFB-DCR} ║ 12/10/2014 ║ 53 ║ 53 ║ 2765 ║
║ 58251 ║ PHILIPPEDERSEN_L08_A2_1 ║ {CSFB/DCR} ║ 03/10/2014 ║ 24 ║ 24 ║ 1003 ║
╚═══════╩══════════════════════════╩═════════════╩════════════╩═══════╩════════════════╩═══════╝
你可以帮我解决一下吗?
一种方法是使用"where [Short Name] like '%Lxx%'"
创建三个不同的tmp表
然后将它们合并在一起,但我试图避免这种情况。你会想到一个存储过程吗?谢谢你的帮助
答案 0 :(得分:0)
如果我理解你的错误,你想要每行进行一次计算吗?如果是这样,这个查询应该是你想要的。如果您在表中永久需要它,则可以使用case表达式作为计算列的源。
MS SQL Server 2008架构设置:
CREATE TABLE Table1
([ID] int, [Short Name] varchar(24), [Day] datetime, [CSFB] int, [SomeNumberHere] int, [DCR] int)
;
INSERT INTO Table1
([ID], [Short Name], [Day], [CSFB], [SomeNumberHere], [DCR])
VALUES
(58144, 'PERSVN_L26_C_1', '2014-06-10 02:00:00', 588, 588, 15727),
(58145, 'PERSVN_L26_C_1', '2014-07-10 02:00:00', 587, 587, 16733),
(58146, 'PERSVN_L18_C_1', '2014-08-10 02:00:00', 640, 640, 15109),
(58250, 'PETERLORANGESVEI_L18_C_1', '2014-12-10 01:00:00', 53, 53, 2765),
(58251, 'PHILIPPEDERSEN_L08_A2_1', '2014-03-10 01:00:00', 24, 24, 1003)
;
查询1 :
SELECT
ID,
[Short Name],
CASE
WHEN [Short Name] LIKE '%L26%' THEN DCR+CSFB
WHEN [Short Name] LIKE '%L18%' THEN DCR-CSFB
WHEN [Short Name] LIKE '%L08%' THEN DCR/CSFB
END AS Calculation,
Day,
CSFB,
SomeNumberHere,
DCR
FROM TABLE1
<强> Results 强>:
| ID | SHORT NAME | CALCULATION | DAY | CSFB | SOMENUMBERHERE | DCR |
|-------|--------------------------|-------------|---------------------------------|------|----------------|-------|
| 58144 | PERSVN_L26_C_1 | 16315 | June, 10 2014 02:00:00+0000 | 588 | 588 | 15727 |
| 58145 | PERSVN_L26_C_1 | 17320 | July, 10 2014 02:00:00+0000 | 587 | 587 | 16733 |
| 58146 | PERSVN_L18_C_1 | 14469 | August, 10 2014 02:00:00+0000 | 640 | 640 | 15109 |
| 58250 | PETERLORANGESVEI_L18_C_1 | 2712 | December, 10 2014 01:00:00+0000 | 53 | 53 | 2765 |
| 58251 | PHILIPPEDERSEN_L08_A2_1 | 41 | March, 10 2014 01:00:00+0000 | 24 | 24 | 1003 |
答案 1 :(得分:0)
只需将计算列添加到表中,计算值基于CASE语句。
即:
ALTER tableName
ADD [Calculation] DECIMAL(14,5) AS CASE WHEN [Short Name] LIKE '%L26%' THEN DCR + CSFB
WHEN [Short Name] LIKE '%L18%' THEN DCR - CSFB
WHEN [Short Name] LIKE '%L08%' THEN DCR / CSFB
ELSE 0 END