BinnyVishwant Ответов: 2

Это просто запрос, но не обязательно для публикации


M(  "Cost_Fact3". "CostAmount" ) AS  "C8"
FROM  "PalsDW". "dbo". "Cost_Fact" "Cost_Fact3"
WHERE  "Cost_Fact3". "CurrencySID" =3
GROUP BY  "Cost_Fact3". "PlanningResourceCenterSID",  "Cost_Fact3". "JDEAccountSID",  "Cost_Fact3". "CarrierGroupSID", 
"Cost_Fact3". "CurrencySID", "Cost_Fact3". "CalendarMonthSID",  "Cost_Fact3". "CalendarYear", 
CASE  "Cost_Fact3". "CalendarMonthSID"
WHEN 1 
THEN  '01'
WHEN 2 
THEN  '02'
WHEN 3 
THEN  '03'
WHEN 4 
THEN  '04'
WHEN 5 
THEN  '05'
WHEN 6 
THEN  '06'
WHEN 7 
THEN  '07'
WHEN 8 
THEN  '08'
WHEN 9 
THEN  '09'
WHEN 10 
THEN  '10'
WHEN 11 
THEN  '11'
WHEN 12 
THEN  '12'
END , LTRIM( RTRIM( CONVERT( CHAR,  "Cost_Fact3". "CalendarYear" ) ) ) + LTRIM( RTRIM( 
CASE  "Cost_Fact3". "CalendarMonthSID"
WHEN 1 
THEN  '01'
W
THEN  '07'
WHEN 8 
THEN  '08'
WHEN 9 
THEN  '09'
WHEN 10 
THEN  '10'
WHEN 11 
THEN  '11'
WHEN 12 
THEN  '12'
END ) ) )  "T0"


Что я уже пробовал:

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

0x01AA

Первая идея: удалите свой случай blabla, чтобы преобразовать число в строку. Тогда SQL становится, скорее всего, также более приятным для чтения. В нынешнем виде мне не нравится даже смотреть на него, чтобы понять, что он должен делать ;)

ZurdoDev

Прекратите все эти безумные "когда". Google как получить 2-значный номер.

ZurdoDev

Но нет, мы не можем сказать вам, как сделать это быстрее, потому что мы не видим ничего важного.

Michael_Davies

Какие тайминги вы получаете в данный момент и на сколько записей?

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

PIEBALDconsult

Избегайте манипуляций со строками в SQL - это должно быть сделано в другом месте.
Посмотрите в функцию форматирования
https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql

Вам не только не должно быть разрешено создавать индекс, но, вероятно, вам не должно быть разрешено писать код.

2 Ответов

Рейтинг:
2

CHill60

Если вам абсолютно необходимо вернуть форматированную строку, то используйте FORMAT функция-она существует с SQL Server 2012. В противном случае используйте комбинацию REPLICATE и CONVERT.

Кстати о CONVERT если вы используете CONVERT(VARCHAR, CalendarYear ) скорее, чем CONVERT(CHAR, CalendarYear ) тогда вам не понадобится LTRIM(RTRIM( на результатах. Ты не нуждался в этом. LTRIM(RTRIM( на CASE раздел вообще.

Вам также нужно посмотреть использование OVER[^] с агрегатными функциями, такими как SUM - Это намного проще в использовании, чем неудобно GROUP BY предложения, подобные вашим, SQL легче читать, а также гораздо эффективнее.

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

SELECT  PlanningResourceCenterSID,  JDEAccountSID, 
	CarrierGroupSID,  CurrencySID,  CalendarMonthSID, 
	CalendarYear,  CalendarMonthSID AS Calendar_Month_Local_Time,  
	FORMAT(CalendarMonthSID, '00') AS  Month_C, 
	CONVERT(VARCHAR,  CalendarYear ) + FORMAT(CalendarMonthSID, '00') AS  Year_Month_con,  
	SUM(CostAmount) OVER (PARTITION BY   PlanningResourceCenterSID,  JDEAccountSID,  CarrierGroupSID, CurrencySID, CalendarMonthSID,  CalendarYear)  AS  CostAmount
	FROM  Cost_Fact
	WHERE  CurrencySID =3


Рейтинг:
0

CC_12497356

Select REPLICATE(0,2-len(<column_name>) + <column_name>


CHill60

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