2015-09-17 9 views
0

Как получить процент столбца, а затем вставить его в виде строкSQL запрос Расщепление столбца на несколько строк разделить на проценте

Col1 item TotalAmount** 
1  ABC 5558767.82 
2  ABC 4747605.5 
3  ABC 667377.69 
4  ABC 3844204 
6  CTB 100 
7  CTB 500.52 

Мне нужно создать новый процент столбцов для каждого элемента, который я сделал как: - Выбор пункта, (totalAmount/выберите сумму (totalAmount) от table1) в процентах от table1 Группа по пункту

Col1 item TotalAmount  percentage 
1  ABC  5558767.82  38 
2  ABC  4747605.5  32 
3  ABC  667377.69  5 
4  ABC  3844204   26 
6  CTB  100    17 
7  CTB  500.52   83 

Теперь, сложную часть я должен рассчитать другую сумму, умножив этот процент на сумму из другой таблицы say table2 ii) обновить столбец «Общая сумма», пролив столбец общей суммы таблицы 1 на 2 строки - 1-й ряд нового Calculate PledgeAmount и 2-я строка - (totalAmount - PledgeAmount)

* Выберите t1.percentage * t2.new сумму в качестве [PledgeAmount] Из таблицы 1 присоединиться к table2, где t1.item = t2.item *

. например для col1 Сумма 5558767.82 будет разделена на две строки. Конечный результат выборки для: -

Col1 item TotalAmount Type 
1  ABC  363700.00  Pledge 
1  ABC  5195067.82 Unpledge 

....

Я использую временную таблицу, чтобы сделать расчеты. Один из способов, по моему мнению, рассчитать сумму заложенных и нелицензированных в качестве нового столбца и сводить его, но его огромная таблица с сотнями столбцов она не будет работать быстро.

Любой другой эффективный способ?

+0

«но его огромный стол с сотнями колонок» - колонны? В самом деле? - Но что мешает вам просто использовать временную таблицу для хранения общей суммы за элемент. Оттуда должно быть легко действовать. – JimmyB

+0

Эти 3 столбца являются лишь частью огромной таблицы. Я уже сохраняю значение для общей суммы за элемент в таблице Temp. Извините, я не очень люблю объяснять :(Я вычислил процент, но часть, чтобы разделить общую сумму на строки, умножив новый percetage на tabl2 и row2 как разницу. –

ответ

0

Вы можете использовать оконную функцию, чтобы решить эту проблему - первый в подзапросе вычислить общее, а затем в главном запросе процента:

Select *, (totalAmount/total_for_item)*100 as percent_of_total 
from (
    SELECT t.*, 
      SUM(totalAmount) OVER (PARTITION BY item) as total_for_item 
    FROM table t 
) sub 
+0

Спасибо, но как насчет второй части разделения или обновления оригинала общая сумма в 2 строки? –

+1

Я вижу ... два вопроса в одном. Обычно нахмурился здесь ... На самом деле, твоя вторая часть мне не имеет смысла.Пожалуйста, ознакомьтесь с тем, как задать вопрос в разделе FAQ и рассказать об этом вопросе со списком входов и ожидаемых результатов. – Hogan

0

Прежде всего, давайте получить общую сумму за единицу :

SELECT item, SUM(totalAmount) as sumTotal 
INTO #totalperitem 
FROM table1 
GROUP BY item 

Теперь это легко добраться до Процентов:

SELECT t1.Col1, 
     t1.item, 
     t1.totalAmount, 
     t1.totalAmount/tpi.sumTotal*100 AS percentage 
FROM table1 t1 
INNER JOIN #totalperitem tpi on ... 

Tricky часть: Separat e строк с/без соответствия в table2. Может быть сделано с WHERE NOT EXISTS, или, моим предпочтением, с одним внешним соединением:

SELECT t1.item, 
     CASE WHEN tpledged.item IS NULL 
     THEN "Unpledged" 
     ELSE "Pledged" 
     END, 
     SUM(t1.totalAmount) AS amount 
FROM table1 t1 
LEFT OUTER JOIN table2 tpledged ON t1. ... = tpledged. ... 
GROUP BY t1.item, 
     CASE WHEN tpledged.item IS NULL 
      THEN "Unpledged" 
      ELSE "Pledged" 
     END 

Основная хитрость заключается в создании искусственных колонок от наличия/отсутствия записей в table2 и также группы по этому искусственному колонка.

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