2015-11-23 3 views
2

У меня есть 3 столбца, которые являются строковыми столбцами, рассчитанными с использованием сложной подстроки и заменой функций.Согласование вычисленных полей в SQL

У меня есть 4-я колонка, которая должна быть col1 + col2 + col3.

В настоящий момент четвертый столбец повторяет вычисления, необходимые для вычислений col1 и col2 и col3.

ЗЕЬЕСТ выглядит примерно так (я удалил большую часть функций):

select 
STR(c1, 2, 0) as col1, 
STR(c2, 2, 0) as col2, 
STR(c3, 2, 0) as col3, 
STR(c1, 2, 0) + STR(c2, 2, 0) + STR(c3, 2, 0) as col4 
from blah 

Вопрос заключается в том, что мы повторяем функции для расчета колонн, преодолев DRY принципала и открытие возможность ошибок ползать в

Я бы предпочел, если мы могли бы сделать что-то вроде этого:.

select 
STR(c1, 2, 0) as col1, 
STR(c2, 2, 0) as col2, 
STR(c3, 2, 0) as col3, 
col1 + col2 + col3 as col4 
from blah 

есть ли изящный способ сделать это? Я думаю, что это можно сделать, используя временную таблицу, но это похоже на чрезмерный.

Стоит ли делать, или я просто принимаю DRY серьезно.

+0

Выполнять вычисления во вложенном запросе или использовать метод CTE. – openwonk

ответ

2

вы можете сделать это так (извините о форматировании):

select i.col1, i.col2, i.col3, i.col1 + i.col2 + i.col3 as col4 
from (
    select 
    STR(c1, 2, 0) as col1, 
    STR(c2, 2, 0) as col2, 
    STR(c3, 2, 0) as col3, 
    from blah) i 
3

Вы можете сделать это с КТР:

;WITH data_cte (col1, col2, col3) 
AS 
(
    select 
     STR(c1, 2, 0) as col1, 
     STR(c2, 2, 0) as col2, 
     STR(c3, 2, 0) as col3 
    from blah 
) 

SELECT 
    col1, col2, col3, 
    col1 + col2 + col3 as col4 
FROM data_cte 
+0

Спасибо, +1 за хорошую идею, я выбрал Питса только потому, что считаю его немного более компактным. –

0

Это еще одно решение (но я признаю, я предпочел бы КТР подход DavidG в (+1 с моей стороны)

Просто, чтобы показать. , что вам нужно какое-то суб выбрать, чтобы дать вам столбцы имен вы можете работать с:

SELECT col1,col2,col3,col4 
FROM 
(
    SELECT STR(c1, 2, 0) as col1, 
      STR(c2, 2, 0) as col2, 
      STR(c3, 2, 0) as col3 
    FROM @tbl 
) AS tbl 
CROSS APPLY(SELECT col1 + col2 + col3) as ThisIs(col4) 
+0

Спасибо за ответ, я думаю, что этот способ сделать это более кратким, какова цель Креста Применить, у меня была игра с ответом Пете, который работает, требуется перекрестное применение? –

+1

@DesHorsley, нет, не очень :-) Это всего лишь способ получить все ваши столбцы, рассчитанные в виде подбора select. Просто хотел показать некоторые способы работы с caculated колонками с «говорящими именами». Моим любимым был CTE ... – Shnugo

Смежные вопросы