T-SQL根据列数据从同一个表的结果创建一个新表

时间:2014-10-13 15:50:43

标签: sql-server join

我很抱歉那里有那种含糊不清的标题,但我不认为有一种简单的方法来解释我在这里要做的事情。 我在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表 然后将它们合并在一起,但我试图避免这种情况。你会想到一个存储过程吗?谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

如果我理解你的错误,你想要每行进行一次计算吗?如果是这样,这个查询应该是你想要的。如果您在表中永久需要它,则可以使用case表达式作为计算列的源。

SQL Fiddle

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