2013-12-11 2 views
0

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

Решение, которое у меня есть, требует, чтобы новый столбец был добавлен к двум представлениям и нескольким отчетам каждый раз, на что нацелены люди (часто).

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

SalesPerson SaleType StockType Date   Value 
------------------------------------------------------------ 
James   Type A  Type B  2013-01-01 100 
James   Type B  Type C  2013-01-02 200 
James   Type C  Type C  2013-01-03 100 
James   Type A  Type A  2013-01-04 300 
James   Type B  Type B  2013-01-05 100 
James   Type C  Type B  2013-01-06 -100 
Harry   Type A  Type B  2013-01-01 200 
Harry   Type B  Type C  2013-01-02 200 
Harry   Type C  Type C  2013-01-03 50 
Harry   Type A  Type A  2013-01-04 50 
Harry   Type B  Type B  2013-01-05 100 
Harry   Type C  Type B  2013-01-06 -200 

Я тогда таблицу с целями, такими как:

SalesPerson Year Month TargetType Value 
--------------------------------------------------- 
James   2013 1  1   500 
James   2013 1  2   400 
Harry   2013 1  2   300 
Harry   2013 1  3   150 

Для подключения два меня переводят таблицу продаж с видом, который включает в себя, если линия продажи включена в каждый тип:

CREATE VIEW SalesWithTargets 

AS 

SELECT SalesPerson 
    , Date 
    , Value 
    , CASE WHEN SaleType = 'Type A' 
      AND Stocktype = 'Type B' 
     THEN 1 ELSE 0 END AS [Type1] 

    , CASE WHEN SaleType = 'Type B' 
      AND Stocktype IN ('Type B', 'Type C') 
     THEN 2 ELSE 0 END AS [Type2] 

    , CASE WHEN SaleType IN ('Type A', 'Type C') 
      AND Stocktype NOT IN ('Type B', 'Type C') 
     THEN 3 ELSE 0 END AS [Type3] 

FROM SalesTransactions 

Затем, чтобы проверить против целей, которые я присоединиться к целевой таблицы в новой SalesWithTargets зрения, как показано ниже:

SELECT SalesPerson 
    , TargetType 
    , Year 
    , Month 
    , Value AS Target 
    , SUM(Value) AS Actual 

FROM Targets 
LEFT JOIN SalesWithTargets ON Targets.TargetType = SalesWithTargets.[Type1] 
          OR Targets.TargetType = SalesWithTargets.[Type2] 
          OR Targets.TargetType = SalesWithTargets.[Type3] 

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

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

Есть ли способ сделать это, чтобы я мог определять типы целей вне утверждения case? например:

TType SaleTypeCriteria SaleTypeVal  StockTypeCriteria StockTypeVal 
---------------------------------------------------------------------------- 
1  Equal    Type A   Equal    Type B 
2  Equal    Type B   In    Type B, Type C 
3  In    Type A, Type C Not In   Type A, Type C 
+0

Забегая или заявление 23 раз будет очень медленно :), и вы хотите, первый я полагаю? В чем проблема с объединением? Вы должны написать 23 левого соединения, а затем объединить с 23 значениями и последним, если все равно –

+0

@MatheseF. Проблема с 'COALESCE' разрешает' IN' и 'NOT IN'. Я не совсем понимаю, что вы подразумеваете под 23 левыми объединениями, можете ли вы привести пример? – bendataclear

ответ

0
SELECT SalesPerson 
    , TargetType 
    , Year 
    , Month 
    , Value AS Target 
    , SUM(coalesce(a1.Value, a2.value, a3.value, 0) AS Actual 

FROM Targets 
LEFT JOIN SalesWithTargets a1 ON Targets.TargetType = SalesWithTargets.[Type1] 
LEFT JOIN SalesWithTargets a1 ON Targets.TargetType = SalesWithTargets.[Type2] 
LEFT JOIN SalesWithTargets a1 ON Targets.TargetType = SalesWithTargets.[Type3] 

Это 23 раз, я предполагаемое значение поступает из левого присоединяемой таблицы

+0

Это просто пересмотр того, что у меня есть в настоящее время, в то время как производительность может несколько увеличиться, но это не решает проблему добавления нового столбца для каждой используемой перестановки целей. – bendataclear

+0

, конечно, это рефакторинг :) у вас может быть динамика sql для создания левого соединения, если вы считаете, что число соединений будет расти и не захочет забывать обновлять запрос :) Но это часто и должно быть быстрее, чем писать или –

+0

Я тестировал это на тестовых данных, которые у меня есть, и производительность значительно хуже. Я думаю, что это потому, что он должен обрабатывать все аргументы case каждый раз, когда представление SalesWithTargets объединяется в таблицу «Targets». – bendataclear

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