2014-01-16 3 views
0

У меня есть эта таблица:просуммировать результат определенных строк путем сравнения строковых значений столбца

fy  period  division   employee_id  category_name  amount 
2013  4   Sales   123452   Salary    130000 
2013  4   Marketing  124232   Salary    120000 
2013  4   Sales-WC   124244   Bonus    10000 
2013  4   Sales   124244   Adjustments  1000 
2013  4   Sales-WC   897287   Salary    65000 

Я пытаюсь получить запрос, который даст мне сумму сумм для каждой категории, но Я хочу объединить разделение, когда на нем есть «-WC».

Этот запрос:

select division_name, category_name, SUM(amount) as amount 
FROM tblStaff 
where fy=2013 and period=4 
group by division_name, category_name 

дает мне близко к тому, что я хочу:

division  category_name  amount 
Sales   Salary    130000 
Sales-WC  Salary    65000 
Sales-WC  Bonus    1000 
Marketing  Salary    120000 
Sales   Adjustments   1000 

Но что я хотел бы это:

division  category_name  amount 
Sales   Salary    195000 
Sales-WC  Bonus    1000 
Marketing  Salary    120000 
Sales   Adjustments   1000 

Где category_name 'Зарплата' было для «Продажи» и «Продажи-WC».

Я пытался, начиная с помощью оператора выбора, как:

SELECT case 
    when division_name = division_name + '-WC' THEN division_name 
    ELSE 'not found' --did this just for testing 
    END as 'division_name', 
    category_name, 
    SUM(amount) 
    FROM tblStaff 
    where fy=2013 and period=4 
    group by division_name, category_name 

Но, похоже, я не могу использовать имя столбца в части сазе, как это, потому что, когда я запускаю эту команду I просто введите div_name = 'not found' для каждой строки.

Любые идеи? Благодаря!

ответ

2

Вы должны проверить, если division_name заканчивается «- WC ', а затем отключите его:

select 
    case 
     when division_name like '%-WC' 
     then substring(division_name from 1 for position('-WC' in division_name) -1) 
     else division_name 
    end, 
    category_name, SUM(amount) as amount 
FROM tblStaff 
where fy=2013 and period_=4 
group by 
    case 
     when division_name like '%-WC' 
     then substring(division_name from 1 for position('-WC' in division_name) -1) 
     else division_name 
    end, 
    category_name 
+0

Это в основном это, за исключением того, что мне пришлось использовать функции LEFT/LEN, как описано в решении @scraatz. Отметьте ваши ответы как ответ, так как он действительно ответил на весь вопрос. Благодаря! – russds

+0

У вас вопрос был отмечен «SQL», и мой ответ на 100% Стандартный SQL :-) – dnoeth

0
SELECT case division_name 
WHEN division_name = division_name + '-WC' THEN division_name 
ELSE 'not found' 

http://technet.microsoft.com/en-us/library/ms189074(v=sql.105).aspx

+0

Я думаю, что это еще один способ сделать оператор CASE, но я попробовал его, и он, похоже, не решает мою проблему. – russds

+0

Можете ли вы уточнить? Это устраняет ошибку 'division_name = 'not found'? –

+0

Возможно, я что-то пропустил, но разве невозможно, чтобы «что-то» было равно «чему-то +» -WC''? – Bohemian

3

Я думаю, что вы хотите LIKE:

SELECT 
    case 
    when division_name LIKE '%-WC' THEN replace(division_name, '-WC', '') 
    ELSE division_name 
    END as 'division_name', 
... 

или вы могли бы просто сделать это:

SELECT 
    replace(division_name, '-WC', '') as division_name, 
    ... 
GROUP BY replace(division_name, '-WC', '') 
+0

Это большое спасибо! Это правильно меняет название столбца деления, но, похоже, SUM не имеет значения, я все равно получаю 130000 для Sales, где я надеюсь получить 195000. – russds

+0

Объединив ваш ответ с @scraatz, я был способный получить правильный запрос. Благодаря! – russds

+1

@russds попробуйте просто заменить – Bohemian

1

Вы можете создать представление, которое удаляет «-WC» из разделов, а не использует ваш первый запрос в этом представлении.

CREATE VIEW _table AS 
SELECT CASE WHEN LEFT(division, 3) = '-WC' THEN RIGHT(division, LENGTH(division)-3) ELSE division END AS _division, .... FROM table 
Смежные вопросы