У меня проблема, с которой я в настоящее время решаюсь с очень грязным решением, я хотел бы знать, есть ли более простой способ поддерживать это.Определение критериев соединения между целями и транзакциями как набор значений
Решение, которое у меня есть, требует, чтобы новый столбец был добавлен к двум представлениям и нескольким отчетам каждый раз, на что нацелены люди (часто).
У меня есть мнение возвращающегося продажи сделок с несколькими атрибутами (сильно обрезаны, как вид имеет более 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
Забегая или заявление 23 раз будет очень медленно :), и вы хотите, первый я полагаю? В чем проблема с объединением? Вы должны написать 23 левого соединения, а затем объединить с 23 значениями и последним, если все равно –
@MatheseF. Проблема с 'COALESCE' разрешает' IN' и 'NOT IN'. Я не совсем понимаю, что вы подразумеваете под 23 левыми объединениями, можете ли вы привести пример? – bendataclear