2014-11-26 5 views
0

Я говорю это, потому что я пробовал все обычные решения, и они просто не работают. вот что у меня есть ..не просто ошибка «column invalid in select list»

Таблица 1

CREATE TABLE dbo.Temp 
(
    PrintData nvarchar(250) NOT NULL, 
    Acronym  nvarchar(3) NOT NULL, 
    Total  int not null 
) 

это успешно заполняется с использованием 3 ВЫБРАТЬ-х с группой К unioned вместе

Таблица 2

CREATE TABLE dbo.Result 
(
    PrintData nvarchar(250) NOT NULL, 
    Acronym  nvarchar(3) NOT NULL, 
    Total  int not null, 
    [Percent] decimal(7,5) not null 
) 

все я хочу сделать, это заполнить эту таблицу из таблицы 1, добавив столбец «Процент», который я рассчитать, используя следующую STMT ..

INSERT INTO dbo.Result 
    (PrintData, Acronym, Total, [Percent]) 
select *, ((t.Total/SUM(t.Total)) * 100) 
from Temp t 
group by PrintData, Acronym, Total 

но процент цв выходит как 0.00000 на каждой строке я думал, что это может иметь что-то делать с группой по но если я удалить его, я получаю, что глупая ошибка я цитировал. некоторые выборочные данные из таблицы 1 ..

OSHIKANGO OSH 1 
WINDHOEK 1 WHA 18 
WINDHOEK 2 WHB 8 
WINDHOEK 3 WHC 2 
WINDHOEK 4 WHD 4 

с этой выборки данных, SUM (Total) составляет 33. то, что я хочу в таблице 2 это ..

OSHIKANGO OSH 1  3.03030 
WINDHOEK 1 WHA 18 54.5454 
WINDHOEK 2 WHB 8  24.2424 
WINDHOEK 3 WHC 2  etc 
WINDHOEK 4 WHD 4 

кажется, что это должно быть проще чем это и надеюсь, что я не должен идти так далеко, как с помощью цикла транзакции/курсора ..

+0

Изменение типа данных [Percent] столбца в виде десятичной дроби (7,4) или десятичной (8, 5). Если вычисленное значение [Percent] равно 100, вы получите сообщение «Ошибка воздушного переполнения». –

+0

Я бы рекомендовал НЕ хранить это рассчитанное значение. Что происходит, когда строка удаляется или обновляется? Вот почему мы не храним вычисляемые значения и вместо этого делаем это во время выполнения. Если бы он не использовал агрегат, я бы предложил использовать вычисляемый столбец. –

ответ

0

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

INSERT INTO dbo.Result (PrintData, Acronym, Total, [Percent]) 
select t1.PrintData, 
t1.Acronym, 
t1.Total, 
tab.computed 
from Temp t1 
join 
(
select PrintData, 
cast(t.Total as decimal(7,5))/SUM(t.Total) * 100 as computed 
from Temp t 
group by PrintData, Total 
) tab on t1.PrintData = tab.PrintData; 
+1

Разве вы все еще не столкнетесь с целыми делениями, так как t.Total и SUM (t.Total) являются ints? –

+0

@ AnthonyGrist, Да, этого не заметил. Благодарю. – Rahul

0

Существует проблема литья, попробуйте этот запрос:

INSERT INTO dbo.Result 
SELECT PrintData, 
     Acronym, 
     Sum(Total) [total], 
     Round(Sum(Total)/Cast((SELECT Sum(Total) 
           FROM temp) AS DECIMAL(10, 4)) * 100, 4) [Percent] 
FROM temp 
GROUP BY PrintData,Acronym 

Кроме того, я вижу, что вы группировать по Total тоже. в этом случае вы можете использовать это:

INSERT INTO dbo.Result 
SELECT *,Round((Sum(Total)OVER(partition BY PrintData, Acronym))/Cast(Sum(Total) OVER() AS DECIMAL(10, 4)) * 100, 4) AS [percent] 
FROM temp 
0

обращенного как к десятичной (7,5)

INSERT INTO dbo.Result 
    (PrintData, Acronym, Total, [Percent]) 
select *, (convert(decimal(7,5),Total)/
(select SUM(convert(decimal(7,5),Total)) * 100 AS [percent] FROM temp)) 
from Temp 
group by PrintData, Acronym, Total