2017-02-08 7 views
2

Как преобразовать T-SQL синтаксис, который написанный CASE WHEN, чтобы PIVOT или window functions с помощью следующего кода:Как я могу преобразовать T-SQL синтаксиса, который написал на случай, когда для поворота или функции окна

SELECT 
    T.TaskID, 
    SUM(CASE WHEN T.LogDate<'2016-02-04' AND T.TaskStatusID=2 THEN ISNULL(DA_CHILD.Value,0)*(T.DoneScore/100) ELSE 0 END) PreAmount, 
    SUM(CASE WHEN T.LogDate>='2016-02-04' AND T.LogDate<='2017-02-04' AND T.TaskStatusID=2 THEN ISNULL(DA_CHILD.Value,0)*(T.DoneScore/100) ELSE 0 END) CurAmount, 
    SUM(CASE WHEN T.LogDate>'2017-02-04' AND T.TaskStatusID=2 THEN ISNULL(DA_CHILD.Value,0)*(T.DoneScore/100) ELSE 0 END) AfterAmount 
FROM 
    NetTasks$ T 
    INNER JOIN NetDeviceActions DA ON DA.DeviceActionID=T.DeviceActionID 
    INNER JOIN NetActionParents AP ON AP.ParentID=DA.ActionID 
    INNER JOIN NetDeviceActions DA_CHILD ON DA_CHILD.ActionID=AP.ChildID AND 
              DA_CHILD.DeviceID=DA.DeviceID AND 
              DA_CHILD.ContractInfoID=DA.ContractInfoID 

WHERE 
     T.ParentTaskID = 0 AND 
     T.FinishDate<='2017-01-07' AND 
     DA.ContractInfoID=15 

GROUP BY 
     T.TaskID, T.DoneScore,T.FinishDate 

Это мой результат:

TaskID PreAmount CurAmount AfterAmount 
686170 0   0   0 
655768 NULL  0   0 
734520 0   NULL  0 
682661 0   NULL  0 
+3

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

+0

Сэмплированные данные не важны. Я хочу выяснить, есть ли способ включить функции поворота или окна. –

+3

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

ответ

0

Вот первое преобразование, которое вы должны поставить свои данные через:

Пожалуйста, проверьте это Erro RS первого

SELECT 
    T.TaskID, 
    CASE 
    WHEN T.LogDate<'2016-02-04' AND T.TaskStatusID=2 
    THEN 'PreAmount' 
    WHEN T.LogDate>='2016-02-04' AND T.LogDate<='2017-02-04' 
    AND T.TaskStatusID=2 THEN 'CurAmount' 
    WHEN T.LogDate>'2017-02-04' AND T.TaskStatusID=2 THEN 'AfterAmount' 
    END As Type, 
    ISNULL(DA_CHILD.Value,0)*(T.DoneScore/100) Amount 
FROM 
    NetTasks$ T 
    INNER JOIN NetDeviceActions DA ON DA.DeviceActionID=T.DeviceActionID 
    INNER JOIN NetActionParents AP ON AP.ParentID=DA.ActionID 
    INNER JOIN NetDeviceActions DA_CHILD ON DA_CHILD.ActionID=AP.ChildID 
    AND DA_CHILD.DeviceID=DA.DeviceID 
    AND DA_CHILD.ContractInfoID=DA.ContractInfoID 
WHERE 
     T.ParentTaskID = 0 AND 
     T.FinishDate<='2017-01-07' AND 
     DA.ContractInfoID=15 

Теперь, если вы посмотрите на этой странице:

https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

Запрос выше имеет место (<SELECT query that produces the data>)

Итак, когда мы следуем этим инструкциям и посмотрим на некоторых примерах , мы пришли к следующему:

SELECT 
TaskID, 
[PreAmount],[CurAmount],[AfterAmount] 
FROM (
SELECT 
    T.TaskID, 
    CASE 
    WHEN T.LogDate<'2016-02-04' AND T.TaskStatusID=2 
    THEN 'PreAmount' 
    WHEN T.LogDate>='2016-02-04' AND T.LogDate<='2017-02-04' 
    AND T.TaskStatusID=2 THEN 'CurAmount' 
    WHEN T.LogDate>'2017-02-04' AND T.TaskStatusID=2 THEN 'c' 
    END As Type, 
    ISNULL(DA_CHILD.Value,0)*(T.DoneScore/100) Amount 
FROM 
    NetTasks$ T 
    INNER JOIN NetDeviceActions DA ON DA.DeviceActionID=T.DeviceActionID 
    INNER JOIN NetActionParents AP ON AP.ParentID=DA.ActionID 
    INNER JOIN NetDeviceActions DA_CHILD ON DA_CHILD.ActionID=AP.ChildID 
    AND DA_CHILD.DeviceID=DA.DeviceID 
    AND DA_CHILD.ContractInfoID=DA.ContractInfoID 
WHERE 
     T.ParentTaskID = 0 AND 
     T.FinishDate<='2017-01-07' AND 
     DA.ContractInfoID=15 
) As SRC 
PIVOT 
(
SUM(Amount) 
FOR Type IN [PreAmount],[CurAmount],[AfterAmount] 
) As PivotTable 

Вот все проблемы с этим:

  • Вы не будете видеть никакого улучшения производительности здесь
  • Ваш код будет более сложным и менее ремонтопригодны

Проблемы с исходным запросом:

  • его полные твердые закодированные даты
  • SUM В зависимости от курса обычно вы получаете укажите номер. Обычно вы суммируете числитель и знаменатель сначала , затем разделите. Возможно, это ваша настоящая проблема.

PS Функция окна делает еще меньше смысла. Я даже не могу думать об разумном способе сделать это.