2014-11-12 3 views
0

Вот небольшой упрощенный отрезала мои данныеTSQL Sum значение на основе двойного значения ID

OrderID QTY ItemID ActualQTY(does not exist in database) 
1  2 1  
2  1 2 
3  1 1 
4  5 3 

Теперь мне нужен запрос, который будет заполнить в ActualQTY на основе ItemID's. Таким образом, подводя общий QTY для ItemID 1 = 3, и ItemID 2 = 1, и последний для ItemID 3 = 5

Он должен выглядеть как этот

OrderID QTY ItemID ActualQTY 
1  2 1  3 
2  1 2  1 
3  1 1  3 
4  5 3  5 

Проблема в том, я новичок в TSQL, и я не могу понять, хороший способ сделай это.

--EDIT--

Кто-то помог мне с этой проблемой и дал это решение, которое кажется наиболее эффективным решением для меня. Однако это решение не работает, если вам нужно применить их к файлу XSD в visual studio. Таким образом, я превратил его в функцию, ориентированную на таблицу на сервере.

SELECT OrderID, QTY, ItemID, SUM(QTY) OVER(PARTITION BY ItemID) AS ActualQTY 

Так что, если это решение не работает курорт ответам ниже

ответ

0

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

SELECT 
    t2.OrderID, 
    t2.QTY, 
    t2.ItemID, 
    t1.ActualQTY 
FROM 
(
    SELECT 
    ItemId, 
    SUM(QTY) AS ActualQTY 
    FROM tablename AS t1 
    GROUP BY ItemId 
) AS t1 
INNER JOIN tablename AS t2 ON t1.ItemId = t2.ItemID; 

Но если вы хотите, чтобы обновить значения столбца ActualQTY, а не просто выбрать, вы можете сделать это:

UPDATE t1 
SET t1.ActualQTY = t2.ActualQTY 
FROM tablename AS t1 
INNER JOIN 
(
    SELECT 
    ItemId, 
    SUM(QTY) AS ActualQTY 
    FROM tablename AS t1 
    GROUP BY ItemId 
) AS t2 ON t1.ItemID = t2.ItemID 
0
SELECT b.OrderID, 
     b.QTY, 
     b.ItemID, 
     a.total_sum AS ActualQTY 
FROM (SELECT ItemID, 
       Sum(QTY) AS total_sum 
     FROM tablename 
     GROUP BY ItemID) AS a 
     INNER JOIN tablename b 
       ON a.ItemID = b.ItemID 
0
Select t.orderid, t.qty, t.itemid, a.actualq as actualqty 
From yourtable t join (
    Select sum(qty) as actualq, itemid 
    From yourtable 
    Group by itemid) a 
On t.itemid = a.itemid 
Смежные вопросы