2015-05-07 2 views
0

Я в настоящее время работаю в студии визуального управления sql 2012. У меня две таблицы. Таблица 1 имеет три столбца (ItemNumber как varchar, Quantity as int и TimeOrdered as datetime). Таблица 2 имеет 2 столбца (ItemNumber как varchar, а Price as float). Обратите внимание, что эти номера позиций не совпадают, номера деталей в таблице 1 имеют букву после номера, в то время как номер позиции в таблице 2 нет. Например, в таблице 1 номер позиции будет выглядеть примерно так: 999999999-E, а другая таблица будет равна 999999999-. Поэтому, чтобы получить номер детали, я должен использовать выбранный Left для 10 цифр.Выберите левые 10 номеров, слева присоединитесь по цене от второй таблицы, а затем суммируйте, SQL

Мне нужно вывести список номеров позиций из таблицы 1 на основе упорядоченного времени, а затем перебрать сравнение этого списка в таблицу 2 и несколько раз умножить количество на общую сумму. Вот мой код до сих пор:

SELECT sum(tbl.quantity * table2.price) as grandtotal, 
     tbl.PartNumber, 
     tbl.quanity, 
     table2.price 
FROM 
    (SELECT left(itemnumber, 10) as itemnumber, quantity 
    FROM table1 
    WHERE TimeOrdered between 
          ('2014-05-05 00:00:00.000') 
         AND 
          ('2015-05-05 00:00:00.000')) as tbl 
Left table2 on 
tbl.partnumber =tbl2.itemnumber 

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

------------- обновление ---------------

Я получил это работает. Извините, что так долго, чтобы вернуться к вам, ребята, я весь день застрял в собрании,

ответ

1

Как об этом. Дело в том, чтобы избежать ошибок div с помощью Zero.

SELECT sum(Isnull(tbl.quantity,0) * Isnull(table2.price,0)) as grandtotal, 
tbl.PartNumber, 
Sum(tbl.quanity), 
case when Isnull(Sum(tbl.quanity),0) = 0 then null else 
     sum(Isnull(tbl.quantity,0) * Isnull(table2.price,0))/Sum(tbl.quanity) end 
as Price 
FROM 
(SELECT left(itemnumber, 10) as itemnumber, quantity FROM table1 WHERE TimeOrdered between 
('2014-05-05 00:00:00.000') 
AND ('2015-05-05 00:00:00.000')) as tbl 
Left outer join table2 on 
tbl.partnumber =tbl2.itemnumber 
group by tbl.PartNumber 
+0

дайте мне минуту, пока я это пробую. – Cheddar

+0

Я получил это, чтобы работать, и у меня есть общая колонка. Теперь, как я могу суммировать общую колонку, не делая таблицу Excel и добавляя ее вручную. – Cheddar

+0

SELECT Sum (grandtotal) from ( - здесь написано выше ) a –

0

SQL-серверу требуется явно указать group by столбцы, которые вы не агрегируете. Поэтому вам нужно добавить group by tbl.PartNumber, tbl.quantity, table2.price. Конечно, это возможно собирается сделать tbl.quantity * table2.price вид бесполезно. Что вы на самом деле пытаетесь сделать? :)

0

SQL Fiddle Example

SELECT SUM(t1.quantity * t2.price) AS 'GrandTotal' 
    ,SUM(t1.quantity) AS 'Quantity' 
    ,t1.itemnumber 
    ,t2.price 
FROM Table1 t1 
JOIN Table2 t2 ON LEFT(t1.itemnumber, 10) = t2.itemnumber 
WHERE t1.Timeordered BETWEEN '2014-05-05 00:00:00.000' AND '2015-05-05 00:00:00.000' 
GROUP BY t1.itemnumber, t2.price 
+0

дать мне момент, когда я пытаюсь это – Cheddar

+0

Все мой выбор столбца выше table1 t1 не может быть привязан. есть идеи? – Cheddar

+0

Можете ли вы опубликовать код? Я тестировал его и работаю для меня – SQLChao

0

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

Ваш код заканчивается следующим образом:

SELECT left(table1.ItemNumber, 10) as PartNumber, 
     table2.price, 
     sum(table1.quantity) as totalquantity, 
     sum(table1.quantity * table2.price) as grandtotal 
FROM table1 
INNER JOIN table2 ON left(table1.ItemNumber, 10) = table2.ItemNumber 
WHERE t1.Timerordered BETWEEN '2014-05-05 00:00:00.000' AND '2015-05-05 00:00:00.000' 
GROUP BY table1.ItemNumber, table2.price