2016-01-25 3 views
0

у меня есть таблица с данными плана продаж на каждую неделю, которая состоит из нескольких колонок:SUM() столбец на основе других столбцов

SAL_DTDGID -- which is date of every Sunday, for example 20160110, 20160117 
SAL_MQuantity --sum of sales plan value 
SAL_MQuantityYTD --sum of plans since first day of the year 
SAL_CoreElement --sales plan data for few core elements 
SAL_Site --unique identifier of place, where sale has happened 

Как суммировать значения в SAL_MQuantityYTD в качестве значений SAL_MQuantity начиная с первых записей 2016 до «сейчас» для каждого сайта и каждого основного элемента?

Каждого сайт упоминается в SAL_Site имеет 52 строки, соответствующее количество недель в году вместе с Примеру 5 различных SAL_CoreElement «ы:

SAL_DTDGID|SAL_MQuantity|SAL_MQuantityYTD|SAL_CoreElement|SAL_Site 
20160110 |20000  |20000   |1    |1234 
20160117 |10000  |30000   |1    |1234 
20160124 |30000  |60000   |1    |1234 

Если что-то не ясно, я попытаюсь объяснить.

+0

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

+0

Эта таблица используется для отчетности. Это единственный факт на складе, и все эти данные должны быть расположены в одной таблице. – Dodzik

+0

Эта таблица может быть верной, если это таблица фактов для базы данных служб анализа. –

ответ

1

Не уверен, что я полностью понимаю ваш вопрос, но это позволит вам восстановить запущенную сумму для SAL_MQuantityYTD. Замените #test тем, что вы называете своей таблицей/представлением.

SELECT *, 
    (SELECT SUM(SAL_MQuantity) 
    FROM #test T2 
    WHERE T2.SAL_DTDGID <= T1.SAL_DTDGID 
     AND T2.SAL_Site = T1.SAL_Site 
     AND T2.SAL_coreElement = T1.SAL_coreElement) AS RunningTotal 
FROM #test T1 

Если вы хотите создать ежегодную цифру, то вы можете также использовать коррелировала подзапрос как этот

SELECT *, 
    (SELECT SUM(SAL_MQuantity) 
    FROM #test T2 
    WHERE cast(left(T2.SAL_DTDGID,4) as integer) = cast(left(T1.SAL_DTDGID,4) as integer) 
     AND T2.SAL_Site = T1.SAL_Site 
     AND T2.SAL_coreElement = T1.SAL_coreElement) AS RunningTotal 
FROM #test T1 

Edit: Просто видел, в основном тот же самый ответ, используя функцию окна.

0

Позвольте мне объяснить вам идею. Пожалуйста, попробуйте ниже.

Select A, B, 
(Select SUM(SAL_MQuantity) 
    FORM [Your Table] 
    WHERE [your date column] between '20160101' AND '[Present date]') AS SAL_MQuantityYTD 
FROM [Your Table] 
+0

Это нехороший подход, так как мне придется обрабатывать [текущую дату] вручную для каждых 52 строк. – Dodzik

+1

Возможно, вам стоит использовать хранимую процедуру. Сохраните все годы в таблице и сделайте конец таблицы. В цикле вы можете выбрать один год после ankther и sum в соответствии с примером выше – thezapper

0

Мое понимание от ваших вопросов является то, что вы хотите иметь с начала года сумма SAL_MQuantity за каждый год (вы можете просто «где» после того, как, если вы хотите только 2016 год), SAL_Site, SAL_CoreElement.

Код, приведенный ниже, должен достичь этого и будет работать на SQL 2008 r2 (im running 2005).

'## t1' - это имя таблицы temp, которое я использовал для тестирования, замените его на имя таблицы.

Select distinct 
     sum (SAL_MQuantity) over (partition by 
            left (cast (cast (SAL_DTDGID as int) as varchar (8)),4) 
            , SAL_Site 
            , SAL_CoreElement 
           ) as Sum_SAL_DTDGID 
     ,left (cast (cast (SAL_DTDGID as int) as varchar (8)),4) as Time_Period 
     , SAL_Site 
     , SAL_CoreElement 
     from ##t1 
Смежные вопросы