SQL Server 2008 R2: объединить два запроса для оптимизации

У меня есть следующий запрос для оптимизации.

После этого используется для получения информации из таблицы прибыли.

  • Первый внутренний SELECT: в первом операторе select я должен получить данные из таблицы прибыли и присвоить номер строки для каждой строки.

  • Второй внутренний SELECT: во втором предложении выбора я должен выполнить некоторый расчет (сумма).

  • Outer SELECT: И получить результат, объединив их в id, а также немного обработать данные.

Код:

SELECT a.p_id, p_Name, convert(varchar, a.EndDate, 107) EndDate, convert(varchar, a.EndDate, 106) NewEndDate, LTRIM(a.p_id)) + '' + REPLACE(LEFT(CONVERT(VARCHAR, a.EndDate, 106), 6) + '' + RIGHT(CONVERT(VARCHAR, a.EndDate, 106), 2), ' ', '') as Compo, a.GP, b.fpro FirstProfit, (b.fpro - b.spro) prodiff, a.Qtity * a.GP as Ov, a.Qtity, b.fproChanPer FROM (SELECT p_Name, p_id, EndDate, GP, FirstProfit, prodiff, Qtity, ROW_NUMBER() OVER (PARTITION By p_Name, p_id ORDER BY EndDate) Rown FROM tbl_profit) a, (SELECT p_id, CAST(SUM(FirstProfit) AS DECIMAL(24,2)) fpro, CAST(SUM(SecondProfit) AS DECIMAL(24,2)) spro, CAST(CAST(SUM(prodiff) AS DECIMAL(24,2)) / CAST(SUM(SecondProfit) AS DECIMAL(24,2)) * 100 AS DECIMAL(24,2)) fproChanPer FROM tbl_profit GROUP BY p_id) b WHERE b.p_id = a.p_id AND Rown = 1 

Мой вопрос: могу ли я объединить эти два (псевдоним a и b ) внутренние операторы SELECT для оптимизации запросов?

Моя попытка: я попытался использовать следующий запрос, но получил другой результат вычисления.

  SELECT p_Name, p_id, EndDate, GP, FirstProfit, prodiff, Qtity ROW_NUMBER()OVER (PARTITION By p_Name,p_id ORDER By EndDate ) Rown, CAST(SUM(FirstProfit) AS DECIMAL(24,2)) fpro, CAST(SUM(SecondProfit) AS DECIMAL(24,2)) spro, CAST(CAST(SUM(prodiff) AS DECIMAL(24,2)) /CAST(SUM(SecondProfit) AS DECIMAL(24,2)) * 100 AS DECIMAL(24,2)) fproChanPer FROM tbl_profit GROUP By p_id,p_Name,EndDate,GP,FirstProfit,prodiff,Qtity 

tbl_profit должен иметь несколько P_Name для одного p_id, когда вы группируете p_id, только вы получаете правильное суммарное значение, тогда как из-за множественного p_имя для одного p_id, когда вы группируете p_id и p_name, ваши общие значения сумм становятся вдвое больше, p_id имеет более одного p_name.

То, как вы написали запрос, чтобы получить Rown = 1 записей в этом случае, идеально, по-прежнему есть возможности для оптимизации. Я сделал несколько вещей, пожалуйста, проверьте.

 SELECT a.p_id, p_Name, CONVERT(varchar, a.EndDate, 107) EndDate, CONVERT(varchar, a.EndDate, 106) NewEndDate, LTRIM(a.p_id) + '' + REPLACE(LEFT(CONVERT(varchar, a.EndDate, 106), 6) + '' + RIGHT(CONVERT(varchar, a.EndDate, 106), 2), ' ', '') AS Compo, a.GP, b.fpro AS FirstProfit, (b.fpro - b.spro) prodiff, a.Qtity * a.GP AS Ov, a.Qtity, b.fproChanPer FROM ( SELECT a.p_Name, a.p_id, a.EndDate, a.GP, a.FirstProfit, a.prodiff, a.Qtity, ROW_NUMBER() OVER (PARTITION BY a.p_Name, a.p_id ORDER BY a.EndDate) Rown FROM tbl_profit AS a WITH (NOLOCK) ) AS a INNER JOIN ( SELECT b.p_id, CAST(SUM(b.FirstProfit) AS decimal(24, 2)) fpro, CAST(SUM(b.SecondProfit) AS decimal(24, 2)) spro, CAST(CAST(SUM(b.prodiff) AS decimal(24, 2)) / CAST(SUM(b.SecondProfit) AS decimal(24, 2)) * 100 AS decimal(24, 2)) fproChanPer FROM tbl_profit AS b WITH (NOLOCK) GROUP BY b.p_id ) AS b ON b.p_id = a.p_id AND a.Rown = 1 
Interesting Posts

Использование univot SQL для двух групп

Необходимо проверить внутреннее соединение и подзапрос

Самый простой способ реализовать этот SQL-запрос?

Столбец SQL Server String как уникальный ключ

Справка по запросам MSSQL? Должно быть легко, но мне нужно больше кофе?

Соответствующий индекс SQL-сервера для схемы «только вставить»

В MS SQL, как объединить varchar и seperate с запятой (если оба varchar существуют)

PIVOT без агрегата. Использование Max для нескольких столбцов

Грязные чтения в SQL Server AlwaysOn

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

Приложение в клиентской базе данных висит приложение

найти строки, где комбинация не существует SQL

Существуют ли какие-либо инструменты для миграции (a la Ruby) на Microsoft SQL Server (MSSQL)?

Ошибка преобразования Varchar в Datetime для вычисления DateDiff в SQL Server

Получите все четверти в формате Месяц, Год между двумя датами

Давайте будем гением компьютера.