I am working through the below query and would like to use it as a data source in Tableau - a field I will need is 'SUM_ORDERS'/'SUM_FCST' - is there anyway to calculate that in the below query given the aggregate and Case functions? Don't seem to be able to divide on the whole aggregate or on the name of the new field (ie 'SUM_FCST') Thanks in advance.
SELECT M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.MATERIAL_AVAILABILITY_DATE,
SUM(CASE WHEN M.REQUIREMENT_TYPE = 'PB' THEN M.QUANTITY ELSE 0 END) AS 'SUM_FCST',
SUM(CASE WHEN M.REQUIREMENT_TYPE IN('01','04','KE') THEN M.QUANTITY ELSE 0 END) AS 'SUM_ORDERS',
A.Product_Division,
A.BU_Group,
A.Business_Segment,
A.Gender
FROM VW_MRP_ALLOCATION M
LEFT OUTER JOIN vw_Article_Attributes A ON M.MATERIAL = A.Article
WHERE M.REQUIREMENT_CATEGORY IN ('A60381000', 'A60382000')
AND M.MATERIAL_AVAILABILITY_DATE BETWEEN GETDATE() AND GETDATE() + 90
AND M.MATERIAL IN ('AA2721',
'AA2723',
'AA5205',
'AA5206',
'AA5207',
'AA5208',
'AA5209',
'AA5210',
'AB3120',
'AB3121',
'AB3131',
'AC5234',
'AC5235',
'AC5236',
'AC5237',
'AC5254',
'AC5256',
'AH9802',
'AH9803',
'AH9804',
'AI3331',
'AI6206',
'AJ5837',
'AJ5838',
'AJ5839',
'AJ5840',
'AJ5841',
'AJ5842',
'AJ5844',
'AJ5846',
'AJ5863',
'AJ5867',
'AJ5869',
'AJ5871',
'AJ5879',
'AJ5880',
'AJ5881',
'AJ5882',
'AJ5883',
'AJ5892',
'AJ5893',
'AJ5894',
'AJ5895',
'AJ5898',
'AJ5899',
'AJ5900',
'AJ5901',
'AJ5915',
'AJ5916',
'AJ5919',
'AN9829',
'AN9848',
'AN9854',
'AN9855',
'AO1612',
'AO1855',
'AP0354',
'AP0356',
'AP0364',
'AP0365',
'AP0366',
'AP0529',
'AP0530',
'AP0531',
'AP0534',
'AP0535',
'AP0536',
'AP0537',
'AP0540',
'AP0541',
'AP0543',
'AP0544',
'AP0545',
'AP0548',
'AP0549',
'AP0551',
'AP0552',
'AP0553',
'AP0554',
'AP0558',
'AP1855',
'AP1856',
'AP1857',
'AP1858',
'AP1859',
'AP1860',
'AP1861',
'AP1862',
'AP1863',
'AP1864',
'AP1865',
'AP1866',
'AP1867',
'AP1868',
'AP1869',
'AP1870',
'AP1871',
'AP1872',
'AP1873',
'AP1874',
'AP1875',
'AP1876',
'AP1877',
'AP1878',
'AP4362',
'AP4363',
'AP4364',
'AP4365',
'AP4366',
'AP4367',
'AP4980',
'AP4981',
'AP4982',
'AP4983',
'AP5204',
'AP5205',
'AP5206',
'AP5207',
'AP5208',
'AP5209',
'AP5210',
'AP5211',
'AP5212',
'AP5648',
'AP5649',
'AP5650',
'AP5651',
'AP5652',
'AX6087',
'AX7043',
'AY1795',
'AY1796',
'AY1839',
'AY2858',
'AY2859',
'AY2867',
'AY2868',
'AY2879',
'AY2881',
'AY2883',
'AY2885',
'AY2886',
'AY2888',
'AY2889',
'AY2890',
'AY2896',
'AY2898',
'AY2983',
'AY2984',
'AZ5389',
'AZ5390',
'AZ5395',
'AZ5396',
'AZ5398',
'AZ5400',
'AZ5402',
'AZ5406',
'B43242',
'B43243',
'B43244',
'B43245',
'B43246',
'B45108',
'B45109',
'B45110',
'B45112',
'B45113',
'BJ9093',
'BJ9095',
'BJ9096',
'BJ9097',
'BJ9098',
'BJ9103',
'BJ9110',
'BJ9111',
'BJ9112',
'BJ9113',
'BJ9114',
'BJ9121',
'BJ9126',
'BJ9127',
'BJ9128',
'BJ9129',
'BJ9131',
'BJ9137',
'BJ9143',
'BJ9144',
'BJ9145',
'BJ9147',
'BJ9148',
'BJ9152',
'BJ9161',
'BJ9163',
'BJ9164',
'BJ9165',
'BJ9166',
'BJ9171',
'BJ9173',
'BJ9174',
'BJ9176',
'BJ9177',
'BJ9179',
'BJ9185',
'BJ9186',
'BJ9189',
'BJ9192',
'BJ9194',
'BJ9195',
'BJ9196',
'BJ9197',
'BJ9198',
'BJ9200',
'BJ9201',
'BJ9202',
'BJ9203',
'BJ9205',
'BJ9206',
'BJ9207',
'BJ9226',
'BJ9228',
'BJ9229',
'BJ9231',
'BJ9294',
'BJ9296',
'BK0292',
'BK0293',
'BK0348',
'BK0350',
'BK0351',
'BK0387',
'BK4765',
'BK4766',
'BK4771',
'BK4772',
'BK4773',
'BK4774',
'BK4775',
'BK4776',
'BK4777',
'BK4778',
'BK4779',
'BK4780',
'BK4781',
'BK4782',
'BK5154',
'BK5428',
'BK5434',
'BK5435',
'BK5437',
'BK5438',
'BK5439',
'BK5444',
'BP5424',
'BP6019',
'BP6022',
'BQ2622',
'BQ2626',
'BQ2628',
'BQ2631',
'BQ2633',
'BQ2634',
'BQ2718',
'BQ2719',
'BQ2722',
'BQ2724',
'BQ2729',
'BQ2730',
'BQ2741',
'BQ2748',
'BQ2749',
'BQ2751',
'BQ2763',
'BQ2765',
'BQ2768',
'BQ2801',
'BQ2806',
'BQ2810',
'BQ2814',
'BQ2815',
'BQ6500',
'BQ7077',
'BQ8196',
'BQ8199',
'BQ8201',
'BQ8243',
'BQ8245',
'BQ8248',
'BR1977',
'BR2701',
'BR2704',
'BR2707',
'BS0042',
'BS0047',
'BS4211',
'BS4212',
'BS4213',
'BS4215',
'BS4216',
'BS4217',
'BS4219',
'BS4224',
'BS4225',
'BS4227',
'BS4228',
'BS4229',
'BS4231',
'BS4232',
'BS4235',
'BS4236',
'BS4237',
'BS4239',
'BS4240',
'BS4241',
'BS4242',
'BS4250',
'BS4252',
'BS4253',
'BS4254',
'BS4256',
'BS4257',
'BS4258',
'BS4260',
'BS4261',
'BS4262',
'BS4264',
'BS4265',
'BS4266',
'BS4268',
'BS4269',
'BS4270',
'BS4271',
'BS4273',
'BS4274',
'BS4275',
'BS4277',
'D84856',
'F82133',
'F82134',
'F82135',
'M35339',
'M35340',
'M35341',
'M64058',
'M64059',
'M64060',
'S04518',
'S05722',
'S05723',
'S05724',
'S05725',
'S05726',
'S05727',
'S05728',
'S05730',
'S05731',
'S05732',
'S05733',
'S05747',
'S05748',
'S05749',
'S05750',
'S05751',
'S05752',
'S05753',
'S05755',
'S05756',
'S05757',
'S05758',
'S16146',
'S16147',
'S16148',
'S16149',
'S16150',
'S16151',
'S16152',
'S16153',
'S16154',
'S16155',
'S16158',
'S16159',
'S16160',
'S16161',
'S16163',
'S16164',
'S17209',
'S17210',
'S17211',
'S17212',
'S17298',
'S17299',
'S17300',
'S17301',
'S17302',
'S17303',
'S17304',
'S17305',
'S17306',
'S17307',
'S17308',
'S17309',
'S17310',
'S17311',
'S17313',
'S17314',
'S22316',
'S22317',
'S22318',
'S22325',
'S22326',
'S22327',
'S22328',
'S22329',
'S22330',
'S22334',
'S22336',
'S22352',
'S22353',
'S22354',
'S22355',
'S22357',
'S22362',
'S22363',
'S22364',
'S22365',
'S22367',
'S22374',
'S22375',
'S22376',
'S22377',
'S22378',
'S22410',
'S22411',
'S22412',
'S22413',
'S22414',
'S29426',
'S29427',
'S29428',
'S29429',
'S29430',
'S86552',
'S86553',
'S86554',
'S86555',
'S86556',
'S86557',
'S86558',
'S86560',
'S86561',
'S86562',
'S86563',
'S86564',
'S86565',
'S86566',
'S86567',
'S86568',
'S86569',
'S86570',
'S86572',
'S86573',
'S86574',
'S86575',
'S92430',
'S92431',
'S92432',
'S92433',
'S92434',
'S92435',
'S92436',
'S92438',
'S92439',
'S92440',
'S92441',
'S92445',
'S92446',
'S92447',
'S92448',
'S92449',
'S92450',
'S92451',
'S92453',
'S92454',
'S92455',
'S92456',
'S93552',
'S93557',
'S96976',
'S96978',
'S99143',
'S99144',
'S99145',
'S99146',
'S99147',
'S99148',
'S99149',
'S99150',
'S99151',
'S99152',
'S99153',
'S99154',
'S99155',
'Z11471',
'Z11474',
'Z11475',
'CD8414',
'CF1045',
'CF1042',
'CF1046',
'CE9563',
'CE9755',
'CD8374',
'CF1047',
'CD8382',
'CF1039',
'CF1049',
'CE9564',
'CD8358',
'CF1044',
'CD8430',
'CE9758',
'CF1036',
'CF1043',
'CF1041',
'CF1038',
'CE9756',
'CF1050',
'CE9759',
'CD8390',
'CD8438',
'CF1037',
'CF1035',
'CD8366',
'CE9565',
'CD8398',
'Z87549')
GROUP BY M.MATERIAL,
M.MATERIAL_DESCRIPTION,
M.MATERIAL_AVAILABILITY_DATE,
A.BU_Group,
A.Business_Segment,
A.Gender,
A.Product_Division
ORDER BY M.MATERIAL,
M.MATERIAL_AVAILABILITY_DATE
You could use NULLIF to avoid 'divide by zero error'
ISNULL(CAST(SUM(CASE WHEN M.REQUIREMENT_TYPE = 'PB'
THEN M.QUANTITY
ELSE 0
END) as decimal)
/ NULLIF(SUM(CASE
WHEN M.REQUIREMENT_TYPE IN('01','04','KE') THEN M.QUANTITY
ELSE 0
END)
,0), 0) AS [SUM_ORDERS/SUM_FCST]
The return result is NULL when 'SUM_FCST' = 0
Related
I am collecting data using a web formular and a workflow with four different status.
Started
Review by Admin
Back to User
Finished
Status 2 and 3 are repeated as long as it is needed. The application logs the history of this process and I would like to be able so see the development of the workflow over time.
The history is stored in an MS SQL Table and I can rearange it to look like this.
In the example there are two workflows (id 1 and 2) and over time the formular goes back and forth untill it is finished. I can order this by time
to derive the result I would like to have.
I dont need to have this result in wide format as long as the counting in long is correct.
I am struggling to find a way to avoid double counting status 2 and 3 and also I dont want to count status 1 later on.
I am rather looking for a strategy to obtain my desired results either in SQL or Power Query.
I tried different grouping, dense_rank and other transformations in Power Query.
Try this in PowerQuery, assumes already date sorted
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Datum", type datetime}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "zStarted", each if [Status]="Started" then 1 else if [Status]="Review by Admin" then -1 else 0),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "zReview", each if [Status]="Review by Admin" then 1 else if [Status]="Back to User" then -1 else if [Status]="Finished" then -1 else 0),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "zBackA", each if [Status]="Back to User" then 1 else null),
#"Filled Down" = Table.FillDown(#"Added Custom2",{"zBackA"}),
#"Added Custom3" = Table.AddColumn(#"Filled Down", "zBackB", each if [zBackA]=null then 0 else if [Status]="Back to User" then 1 else if [Status]="Review by Admin" then -1 else 0),
#"Added Custom4" = Table.AddColumn(#"Added Custom3", "zFinished", each if [Status]="Finished" then 1 else 0),
#"Added Index" = Table.AddIndexColumn(#"Added Custom4", "Index", 0, 1, Int64.Type),
// cumulative sum, converting to zero if <0
#"Cum1" = Table.AddColumn(#"Added Index", "Started", each List.Max(List.Combine({{0}, {List.Sum(List.FirstN(#"Added Index"[zStarted],[Index]+1))}}))),
#"Cum2" = Table.AddColumn(#"Cum1", "Review By Admin", each List.Max(List.Combine({{0}, {List.Sum(List.FirstN(#"Added Index"[zReview],[Index]+1))}}))),
#"Cum3" = Table.AddColumn(#"Cum2", "Back to User", each List.Max(List.Combine({{0}, {List.Sum(List.FirstN(#"Added Index"[zBackB],[Index]+1))}}))),
#"Cum4" = Table.AddColumn(#"Cum3", "Finished", each List.Max(List.Combine({{0}, {List.Sum(List.FirstN(#"Added Index"[zFinished],[Index]+1))}}))),
#"Removed Columns" = Table.RemoveColumns(Cum4,{"ID","zStarted", "zReview", "zBackA", "zBackB", "zFinished", "Index","Status"})
in #"Removed Columns"
ID
Datum
Status
1
06/24/22
Started
2
06/25/22
Started
1
06/26/22
Review by Admin
2
06/27/22
Review by Admin
1
06/28/22
Back to User
1
06/29/22
Review by Admin
2
06/30/22
Back to User
1
07/01/22
Back to User
1
07/02/22
Review by Admin
2
07/03/22
Review by Admin
1
07/04/22
Finished
2
07/05/22
Back to User
2
07/06/22
Review by Admin
2
07/07/22
Finished
Thanks to #horseyride i came up with my own solution using case and a similar approach within SQL
I follow a three step appraoch to avoid the double counting of changes in status by using the lagged status (sql columne action_nam)
With the lagged status I can then unambigously define the changes of the status and take the cumulutive sum.
I mark the first answer as accepted as this one helped me to find my own solution. I leave my solution with the Germany Status names just for completeness
Select top 600 created, form_uuid, Cum_Erstellt, Cum_Review, Cum_Korrektur, Cum_Fertig from (
Select *,
sum(Erstellt) over(Partition by form_uuid order by form_uuid, created) as Cum_Erstellt,
sum(Review) over(Partition by form_uuid order by form_uuid, created) as Cum_Review,
sum(Korrektur) over(Partition by form_uuid order by form_uuid, created) as Cum_Korrektur,
sum(Fertig) over(Partition by form_uuid order by form_uuid, created) as Cum_Fertig,
Erstellt+Review+Korrektur+Fertig as Vergleich
from (
Select created, form_uuid, encoded_key, action_name, lag_action,
CASE WHEN action_name = 'Datensatz erstellt und zur Bearbeitung an Datenlieferanten übergeben' THEN 1
When action_name = 'Datensatz zur Prüfung an Datensammler' and
lag_action='Datensatz erstellt und zur Bearbeitung an Datenlieferanten übergeben' THEN -1
Else 0 END AS Erstellt,
CASE WHEN action_name = 'Datensatz zur Prüfung an Datensammler' THEN 1
When action_name= 'Datensatz zur Korrektur an Datenlieferanten' Then -1
when Action_name= 'Datensatz erneut Öffnen' then 1
When action_name='Datensatz durch Datensammler bestätigt' Then -1
Else 0 END AS Review,
CASE
WHEN action_name = 'Datensatz zur Prüfung an Datensammler' and
lag_action!='Datensatz erstellt und zur Bearbeitung an Datenlieferanten übergeben' THEN -1
When action_name= 'Datensatz zur Korrektur an Datenlieferanten' Then 1
Else 0 END AS Korrektur,
CASE WHEN action_name = 'Datensatz durch Datensammler bestätigt' THEN 1
When action_name= 'Datensatz erneut Öffnen' Then -1
Else 0 END AS Fertig
from (
Select created, form_uuid, encoded_key, action_name, lag(action_name,1,NULL)
over( order by encoded_key, form_uuid, created) as lag_action
from process_instance_hist ) lag_table
) change_table
) cum_table
order by created, encoded_key
--group by created, form_uuid
I have the following Linq queries that differs only on the where clause:
Query 1:
var initialList = await
context.AlertDetailsDbSet
// Pouring the TrackedVehicule related graph
.Include(ad => ad.TrackedVehicule.Registration)
.Include(ad => ad.TrackedVehicule.Device)
.Include(ad => ad.TrackedVehicule.GpsBox.Icon)
.Include(ad => ad.TrackedVehicule.GpsBoxTypeNavigation.Icon)
.Include(ad => ad.TrackedVehicule.VehiculeGpsBoxInfo.VehiculeConfigurationNavigation)
// Loading the associated alert
.Include(ad => ad.Alert)
#if NETSTANDARD2_1
// This filter is not supported with EF Core 2.X
// It should be done client side
.Where(ad => ad.Alert.CompanyId == companyId && ad.Alert.AlertRule.Contains("SerializableContextAlert") && ad.AlertDateTime >= startDate && ad.AlertDateTime <= endDate && ad.TrackedVehicule != null && ad.TrackedVehicule.CompanyId == companyId && ad.TrackedVehicule.RowEnabled == true && (ad.TrackedVehicule.GpsBoxType == 29 || ad.TrackedVehicule.GpsBoxType == 12))
#endif
.Skip(0)
// A limit is applied on returned elements
.Take(1000)
.OrderByDescending(ad => ad.AlertDateTime)
// .Skip(skip)
// .Take(take)
// We disable the tracking mechanism because the context will be thrown away as soon as we have the data
.AsNoTracking()
// We want an asynchrounous execution
.ToListAsync(cancellationToken)
Query 2:
var initialList = await
context.AlertDetailsDbSet
// Pouring the TrackedVehicule related graph
.Include(ad => ad.TrackedVehicule.Registration)
.Include(ad => ad.TrackedVehicule.Device)
.Include(ad => ad.TrackedVehicule.GpsBox.Icon)
.Include(ad => ad.TrackedVehicule.GpsBoxTypeNavigation.Icon)
.Include(ad => ad.TrackedVehicule.VehiculeGpsBoxInfo.VehiculeConfigurationNavigation)
// Loading the associated alert
.Include(ad => ad.Alert)
#if NETSTANDARD2_1
// This filter is not supported with EF Core 2.X
// It should be done client side
.Where(ad => ad.Alert.CompanyId == companyId && ad.Alert.AlertRule.Contains("SerializableContextAlert") && ad.TrackedVehicule != null && ad.TrackedVehicule.RowEnabled == true && ad.TrackedVehicule.CompanyId == companyId && (ad.TrackedVehicule.GpsBoxType == 29 || ad.TrackedVehicule.GpsBoxType == 12) && ad.AckTime.HasValue == acknwoledged)
#endif
.OrderByDescending(ad => ad.AlertDateTime)
.Skip(skip)
.Take(take)
// We disable the tracking mechanism because the context will be thrown away as soon as we have the data
.AsNoTracking()
// We want an asynchrounous execution
.ToListAsync(cancellationToken)
Basically, the first query is (among aother things) filtering on a boolean property, while the second one is filtering on a range of dates.
My problem is that those queries are not translated to the same T-TSQL leading to different results.
TSQL 1 :
exec sp_executesql N'SELECT [t].[AlertDetailID], [t].[AckMachineName], [t].[AckPhoneNumber], [t].[AckTime], [t].[AckUserName], [t].[AlertDateTime], [t].[AlertID], [t].[AlertedCorridorId], [t].[AlertedItemId],
[t].[AssociatedVehiculeID], [t].[AssociatedVehiculeUserID], [t].[Context], [t].[CustomID], [t].[CustomInfo], [t].[DbInsertTime], [t].[IsFleetAlert], [t].[MessageStatus], [t].[ReceivedTime], [t].[RowVersion],
[t].[SafeProtectCustomInfo], [t].[TrackedVehiculeID], [t].[TrackedVehiculeUserID], [v0].[VehiculeID], [v0].[Address], [v0].[AddressProtocol], [v0].[BoardID], [v0].[Category], [v0].[CompanyID], [v0].[CustomId], [v0].[DbInsertTime], [v0].[Description], [v0].[GpsBoxSubType], [v0].[GpsBoxTrackingDelay], [v0].[GpsBoxType], [v0].[HardwareID], [v0].[HasGeoWorker], [v0].[IconID], [v0].[Name], [v0].[PhoneNumber], [v0].[RowEnabled], [v0].[RowVersion], [v0].[VehiculeUserID], [r].[VehiculeID], [r].[CompanyId], [r].[LatestRegistrationStatusChangeDate], [r].[RegistrationMailSent], [r].[RegistrationStatusId], [d].[VehiculeID], [d].[AppVersion], [d].[Brand], [d].[Details], [d].[Imei], [d].[Model], [d].[Name], [d].[OsVersion], [d].[RowVersion], [g].[GpsBoxTypeID], [g].[GpsBoxSubTypeID], [g].[IconId], [g].[Name], [i].[IconId], [i].[Category], [i].[FileName], [i].[Icon], [g0].[GpsBoxTypeId], [g0].[Category], [g0].[IconId], [g0].[Name], [i0].[IconId], [i0].[Category], [i0].[FileName], [i0].[Icon], [v1].[VehiculeID], [v1].[BoardConfiguration], [v1].[BoardConnected], [v1].[BoardCurrentAddress], [v1].[BoardLastCommunicationTime], [v1].[Connected], [v1].[CurrentAddress], [v1].[CurrentDelay], [v1].[FuelConsumptionEstimationTime], [v1].[HeartBeatPeriod], [v1].[InsureCoherence], [v1].[KillHedgehog], [v1].[LastCommunicationTime], [v1].[LastConnexionTime], [v1].[LastParkMileage], [v1].[LastParkMileageTime], [v1].[NormalTrackingMode], [v1].[SmartModeDelay], [v1].[SmartModeDistance], [v1].[TimeModeDelay], [v1].[UpdateStartTime], [v1].[UpdateStatus], [v1].[VehiculeConfiguration], [g1].[ConfigurationID], [g1].[ConfigName], [g1].[Firmware], [g1].[GpsBoxType], [g1].[Master], [g1].[MasterName], [g1].[SimContract], [g1].[System], [a1].[AlertID], [a1].[AlertEnabled], [a1].[AlertRule], [a1].[Always], [a1].[CalendarID], [a1].[Category], [a1].[CompanyID], [a1].[Description], [a1].[DisplayName], [a1].[RowEnabled], [a1].[RowVersion], [a1].[Shared], [a1].[UserID]
FROM (
SELECT [a].[AlertDetailID], [a].[AckMachineName], [a].[AckPhoneNumber], [a].[AckTime], [a].[AckUserName], [a].[AlertDateTime], [a].[AlertID], [a].[AlertedCorridorId], [a].[AlertedItemId], [a].[AssociatedVehiculeID], [a].[AssociatedVehiculeUserID], [a].[Context], [a].[CustomID], [a].[CustomInfo], [a].[DbInsertTime], [a].[IsFleetAlert], [a].[MessageStatus], [a].[ReceivedTime], [a].[RowVersion], [a].[SafeProtectCustomInfo], [a].[TrackedVehiculeID], [a].[TrackedVehiculeUserID], [a0].[AlertID] AS [AlertID0]
FROM [AlertDetail] AS [a]
INNER JOIN [Alert] AS [a0] ON [a].[AlertID] = [a0].[AlertID]
LEFT JOIN [Vehicule] AS [v] ON [a].[TrackedVehiculeID] = [v].[VehiculeID]
WHERE (((((([a0].[CompanyID] = #__companyId_0) AND (CHARINDEX(N''SerializableContextAlert'', [a0].[AlertRule]) > 0)) AND [v].[VehiculeID] IS NOT NULL) AND ([v].[RowEnabled] = CAST(1 AS bit))) AND ([v].[CompanyID] = #__companyId_0)) AND (([v].[GpsBoxType] = 29) OR ([v].[GpsBoxType] = 12))) AND (CASE
WHEN [a].[AckTime] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = #__acknwoledged_1)
ORDER BY [a].[AlertDateTime] DESC
OFFSET #__p_2 ROWS FETCH NEXT #__p_3 ROWS ONLY
) AS [t]
LEFT JOIN [Vehicule] AS [v0] ON [t].[TrackedVehiculeID] = [v0].[VehiculeID]
LEFT JOIN [SafeProtect].[Registration] AS [r] ON [v0].[VehiculeID] = [r].[VehiculeID]
LEFT JOIN [SafeProtect].[Device] AS [d] ON [v0].[VehiculeID] = [d].[VehiculeID]
LEFT JOIN [GpsBoxSubType] AS [g] ON ([v0].[GpsBoxType] = [g].[GpsBoxTypeID]) AND ([v0].[GpsBoxSubType] = [g].[GpsBoxSubTypeID])
LEFT JOIN [cst].[Icon] AS [i] ON [g].[IconId] = [i].[IconId]
LEFT JOIN [GpsBoxType] AS [g0] ON [v0].[GpsBoxType] = [g0].[GpsBoxTypeId]
LEFT JOIN [cst].[Icon] AS [i0] ON [g0].[IconId] = [i0].[IconId]
LEFT JOIN [VehiculeGpsBoxInfo] AS [v1] ON [v0].[VehiculeID] = [v1].[VehiculeID]
LEFT JOIN [GpsBoxConfiguration] AS [g1] ON [v1].[VehiculeConfiguration] = [g1].[ConfigurationID]
INNER JOIN [Alert] AS [a1] ON [t].[AlertID] = [a1].[AlertID]
ORDER BY [t].[AlertDateTime] DESC',N'#__companyId_0 int,#__acknwoledged_1 bit,#__p_2 int,#__p_3 int',#__companyId_0=1013,#__acknwoledged_1=0,#__p_2=0,#__p_3=999
TSQL 2:
exec sp_executesql N'SELECT [t].[AlertDetailID], [t].[AckMachineName], [t].[AckPhoneNumber], [t].[AckTime], [t].[AckUserName], [t].[AlertDateTime], [t].[AlertID], [t].[AlertedCorridorId], [t].[AlertedItemId],
[t].[AssociatedVehiculeID], [t].[AssociatedVehiculeUserID], [t].[Context], [t].[CustomID], [t].[CustomInfo], [t].[DbInsertTime], [t].[IsFleetAlert], [t].[MessageStatus], [t].[ReceivedTime], [t].[RowVersion],
[t].[SafeProtectCustomInfo], [t].[TrackedVehiculeID], [t].[TrackedVehiculeUserID], [v0].[VehiculeID], [v0].[Address], [v0].[AddressProtocol], [v0].[BoardID], [v0].[Category], [v0].[CompanyID], [v0].[CustomId], [v0].[DbInsertTime], [v0].[Description], [v0].[GpsBoxSubType], [v0].[GpsBoxTrackingDelay], [v0].[GpsBoxType], [v0].[HardwareID], [v0].[HasGeoWorker], [v0].[IconID], [v0].[Name], [v0].[PhoneNumber], [v0].[RowEnabled], [v0].[RowVersion], [v0].[VehiculeUserID], [r].[VehiculeID], [r].[CompanyId], [r].[LatestRegistrationStatusChangeDate], [r].[RegistrationMailSent], [r].[RegistrationStatusId], [d].[VehiculeID], [d].[AppVersion], [d].[Brand], [d].[Details], [d].[Imei], [d].[Model], [d].[Name], [d].[OsVersion], [d].[RowVersion], [g].[GpsBoxTypeID], [g].[GpsBoxSubTypeID], [g].[IconId], [g].[Name], [i].[IconId], [i].[Category], [i].[FileName], [i].[Icon], [g0].[GpsBoxTypeId], [g0].[Category], [g0].[IconId], [g0].[Name], [i0].[IconId], [i0].[Category], [i0].[FileName], [i0].[Icon], [v1].[VehiculeID], [v1].[BoardConfiguration], [v1].[BoardConnected], [v1].[BoardCurrentAddress], [v1].[BoardLastCommunicationTime], [v1].[Connected], [v1].[CurrentAddress], [v1].[CurrentDelay], [v1].[FuelConsumptionEstimationTime], [v1].[HeartBeatPeriod], [v1].[InsureCoherence], [v1].[KillHedgehog], [v1].[LastCommunicationTime], [v1].[LastConnexionTime], [v1].[LastParkMileage], [v1].[LastParkMileageTime], [v1].[NormalTrackingMode], [v1].[SmartModeDelay], [v1].[SmartModeDistance], [v1].[TimeModeDelay], [v1].[UpdateStartTime], [v1].[UpdateStatus], [v1].[VehiculeConfiguration], [g1].[ConfigurationID], [g1].[ConfigName], [g1].[Firmware], [g1].[GpsBoxType], [g1].[Master], [g1].[MasterName], [g1].[SimContract], [g1].[System], [a1].[AlertID], [a1].[AlertEnabled], [a1].[AlertRule], [a1].[Always], [a1].[CalendarID], [a1].[Category], [a1].[CompanyID], [a1].[Description], [a1].[DisplayName], [a1].[RowEnabled], [a1].[RowVersion], [a1].[Shared], [a1].[UserID]
FROM (
SELECT [a].[AlertDetailID], [a].[AckMachineName], [a].[AckPhoneNumber], [a].[AckTime], [a].[AckUserName], [a].[AlertDateTime], [a].[AlertID], [a].[AlertedCorridorId], [a].[AlertedItemId], [a].[AssociatedVehiculeID], [a].[AssociatedVehiculeUserID], [a].[Context], [a].[CustomID], [a].[CustomInfo], [a].[DbInsertTime], [a].[IsFleetAlert], [a].[MessageStatus], [a].[ReceivedTime], [a].[RowVersion], [a].[SafeProtectCustomInfo], [a].[TrackedVehiculeID], [a].[TrackedVehiculeUserID], [a0].[AlertID] AS [AlertID0]
FROM [AlertDetail] AS [a]
INNER JOIN [Alert] AS [a0] ON [a].[AlertID] = [a0].[AlertID]
LEFT JOIN [Vehicule] AS [v] ON [a].[TrackedVehiculeID] = [v].[VehiculeID]
WHERE ((((((([a0].[CompanyID] = #__companyId_0) AND (CHARINDEX(N''SerializableContextAlert'', [a0].[AlertRule]) > 0)) AND ([a].[AlertDateTime] >= #__startDate_1)) AND ([a].[AlertDateTime] <= #__endDate_2)) AND [v].[VehiculeID] IS NOT NULL) AND ([v].[CompanyID] = #__companyId_0)) AND ([v].[RowEnabled] = CAST(1 AS bit))) AND (([v].[GpsBoxType] = 29) OR ([v].[GpsBoxType] = 12))
ORDER BY (SELECT 1)
OFFSET #__p_3 ROWS FETCH NEXT #__p_4 ROWS ONLY
) AS [t]
LEFT JOIN [Vehicule] AS [v0] ON [t].[TrackedVehiculeID] = [v0].[VehiculeID]
LEFT JOIN [SafeProtect].[Registration] AS [r] ON [v0].[VehiculeID] = [r].[VehiculeID]
LEFT JOIN [SafeProtect].[Device] AS [d] ON [v0].[VehiculeID] = [d].[VehiculeID]
LEFT JOIN [GpsBoxSubType] AS [g] ON ([v0].[GpsBoxType] = [g].[GpsBoxTypeID]) AND ([v0].[GpsBoxSubType] = [g].[GpsBoxSubTypeID])
LEFT JOIN [cst].[Icon] AS [i] ON [g].[IconId] = [i].[IconId]
LEFT JOIN [GpsBoxType] AS [g0] ON [v0].[GpsBoxType] = [g0].[GpsBoxTypeId]
LEFT JOIN [cst].[Icon] AS [i0] ON [g0].[IconId] = [i0].[IconId]
LEFT JOIN [VehiculeGpsBoxInfo] AS [v1] ON [v0].[VehiculeID] = [v1].[VehiculeID]
LEFT JOIN [GpsBoxConfiguration] AS [g1] ON [v1].[VehiculeConfiguration] = [g1].[ConfigurationID]
INNER JOIN [Alert] AS [a1] ON [t].[AlertID] = [a1].[AlertID]
ORDER BY [t].[AlertDateTime] DESC',N'#__companyId_0 int,#__startDate_1 datetime,#__endDate_2 datetime,#__p_3 int,#__p_4 int',#__companyId_0=1013,#__startDate_1='2020-09-07 21:59:59',#__endDate_2='2020-09-08 21:59:59',#__p_3=0,#__p_4=999
It took me some time to spot a tiny by impacting difference between the two queries.
If you look carefully, the first subquery contains an ORDER BY which is what I want:
ORDER BY [a].[AlertDateTime] DESC
The second linq query, despite using the same OderBy is translated to a TSQL subquery that contains
ORDER BY (SELECT 1)
That sounds crasy to me.
I hope that someone could explain what is going on.
It has nothing to do with filtering (Where), but the order of ordering (OrderBy{Descending}) and row limiting (Skip / Take) operators in LINQ query.
The fake ORDER BY (SELECT 1) definitely is generated for the LINQ query having the following fragment
.Skip(0)
.Take(1000)
.OrderByDescending(ad => ad.AlertDateTime)
// .Skip(skip)
// .Take(take)
As you can see, here the row limiting operators are applied before the ordering. Since SqlServer OFFSET FETCH SQL construct requires ORDER BY, EF Core translator inserts fake one (it would have been better to throw exception or let the database do that, but that's another story. Actually before EF Core 3.0 there was CoreEventId.RowLimitingOperationWithoutOrderByWarning which could be configured to throw, but for some unknown reason it has been obsoleted and has no effect in EF Core 3.x).
The correct place of row limiting of course is after ordering, as it is in the commented out code. So simply remove the (temporary I guess) Skip(0).Take(1000) and uncomment the .Skip(skip).Take(take). Problem solved.
I have a query in Epicor that I built using the BAQ Designer (which is just a gui for creating a SQL query). I recently made a change to add more data and now receive the following error.
The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query.
I'm sure the monster I created is not optimal and I could probably make some changes to make it better. If any of the experts could take a look and help it would be greatly appreciated as I am not a SQL expert, just good enough to break stuff.The SQL is:
With [Sales_Base] AS
(select
[SalesRep].[SalesRepCode] as [SalesRep_SalesRepCode],
[SalesRep].[Name] as [SalesRep_Name],
[InvcHead].[InvoiceNum] as [InvcHead_InvoiceNum],
[InvcHead].[InvoiceDate] as [InvcHead_InvoiceDate],
[InvcHead].[PONum] as [InvcHead_PONum],
[InvcDtl].[ExtPrice] as [InvcDtl_ExtPrice],
[Customer].[CustID] as [Customer_CustID],
[Customer].[Name] as [Customer_Name],
[SalesCat].[Description] as [SalesCat_Description],
[InvcDtl].[ProdCode] as [InvcDtl_ProdCode],
[SalesRep].[RoleCode] as [SalesRep_RoleCode],
[Customer].[GroupCode] as [Customer_GroupCode],
(Constants.Today) as [Calculated_Today],
(Constants.FirstDayOfMonth) as [Calculated_BOM],
(case
when DatePart(month,Constants.Today) in (1,4,7,10) then Constants.FirstDayOfMonth
when DatePart(month,Constants.Today) in (2,5,8,11) then DateAdd(month,-1,Constants.FirstDayOfMonth)
else DateAdd(month,-2,Constants.FirstDayOfMonth)
end) as [Calculated_BOQ],
(case
when DatePart(month,Constants.Today) = 1 then Constants.FirstDayOfMonth
when DatePart(month,Constants.Today) = 2 then DateAdd(month,-1,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 3 then DateAdd(month,-2,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 4 then DateAdd(month,-3,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 5 then DateAdd(month,-4,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 6 then DateAdd(month,-5,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 7 then DateAdd(month,-6,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 8 then DateAdd(month,-7,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 9 then DateAdd(month,-8,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 10 then DateAdd(month,-9,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 11 then DateAdd(month,-10,Constants.FirstDayOfMonth)
else DateAdd(month,-11,Constants.FirstDayOfMonth)
end) as [Calculated_BOY],
[Customer5].[CustID] as [Customer5_CustID],
[Customer5].[Name] as [Customer5_Name],
[Customer5].[GroupCode] as [Customer5_GroupCode],
[SalesRep].[EMailAddress] as [SalesRep_EMailAddress],
[InvcDtl].[InvoiceLine] as [InvcDtl_InvoiceLine],
(InvcDtl.ExtPrice + IsNull(InvcMisc.MiscAmt,0)) as [Calculated_InvcDtl_ExtPrice]
from Erp.SalesRep as SalesRep
left outer join Erp.InvcHead as InvcHead on
SalesRep.Company = InvcHead.Company
And
SalesRep.SalesRepCode = [Ice].entry(1,SalesRepList,'~')
Or
SalesRep.SalesRepCode = [Ice].entry(2,SalesRepList,'~')
Or
SalesRep.SalesRepCode = [Ice].entry(3,SalesRepList,'~')
Or
SalesRep.SalesRepCode = [Ice].entry(4,SalesRepList,'~')
Or
SalesRep.SalesRepCode = [Ice].entry(5,SalesRepList,'~')
and ( InvcHead.Posted = TRUE and InvcHead.InvoiceType <> 'DEP' )
left outer join Erp.InvcDtl as InvcDtl on
InvcHead.Company = InvcDtl.Company
And
InvcHead.InvoiceNum = InvcDtl.InvoiceNum
left outer join Erp.Customer as Customer on
InvcHead.Company = Customer.Company
And
InvcHead.SoldToCustNum = Customer.CustNum
left outer join Erp.SalesCat as SalesCat on
InvcDtl.Company = SalesCat.Company
And
InvcDtl.SalesCatID = SalesCat.SalesCatID
left outer join Erp.Customer as Customer5 on
InvcDtl.Company = Customer5.Company
And
InvcDtl.BTCustNum = Customer5.CustNum
left outer join Erp.InvcMisc as InvcMisc on
InvcDtl.Company = InvcMisc.Company
And
InvcDtl.InvoiceNum = InvcMisc.InvoiceNum
And
InvcDtl.InvoiceLine = InvcMisc.InvoiceLine
and ( InvcMisc.MiscCode = 'exp' )
where (SalesRep.RoleCode in ('sales', 'salesden', 'salesflx', 'salesmed', 'salespm') and SalesRep.SalesRepCode <> 'default' and SalesRep.SalesRepCode <> 'national' and SalesRep.SalesRepCode <> 'house' and SalesRep.SalesRepCode <> 'flexi' and SalesRep.SalesRepCode <> 'prescale' and SalesRep.InActive = FALSE))
,[Sales_Base_Add_MR] AS
(select
(Sales_Base5.SalesRep_SalesRepCode) as [Calculated_A_SalesRepCode],
(Sales_Base5.SalesRep_Name) as [Calculated_A_SalesRepName],
(Sales_Base5.InvcHead_InvoiceNum) as [Calculated_A_InvoiceNum],
(Sales_Base5.InvcHead_InvoiceDate) as [Calculated_A_InvoiceDate],
(Sales_Base5.InvcHead_PONum) as [Calculated_A_PONum],
(Sales_Base5.Calculated_InvcDtl_ExtPrice) as [Calculated_A_ExtPrice],
(Sales_Base5.Customer_CustID) as [Calculated_A_CustID],
(Sales_Base5.Customer_Name) as [Calculated_A_Cust],
(Sales_Base5.SalesCat_Description) as [Calculated_A_SalesCat],
(Sales_Base5.InvcDtl_ProdCode) as [Calculated_A_ProdCode],
(Sales_Base5.SalesRep_RoleCode) as [Calculated_A_RoleCode],
(Sales_Base5.Customer_GroupCode) as [Calculated_A_GroupCode],
(Sales_Base5.Calculated_Today) as [Calculated_A_Today],
(Sales_Base5.Calculated_BOM) as [Calculated_A_BOM],
(Sales_Base5.Calculated_BOQ) as [Calculated_A_BOQ],
(Sales_Base5.Calculated_BOY) as [Calculated_A_BOY],
(Sales_Base5.Customer5_CustID) as [Calculated_A_BTCustID],
(Sales_Base5.Customer5_Name) as [Calculated_A_BTCust],
(Sales_Base5.Customer5_GroupCode) as [Calculated_A_BTGroupCode],
[SalesRep2].[SalesRepCode] as [SalesRep2_SalesRepCode],
[SalesRep2].[Name] as [SalesRep2_Name],
[SalesRep2].[RoleCode] as [SalesRep2_RoleCode],
(Sales_Base5.SalesRep_EMailAddress) as [Calculated_A_Email],
(Sales_Base5.InvcDtl_InvoiceLine) as [Calculated_A_Line]
from Sales_Base as Sales_Base5
left outer join Erp.InvcHead as InvcHead1 on
Sales_Base5.InvcHead_InvoiceNum = InvcHead1.InvoiceNum
left outer join Erp.SalesRep as SalesRep2 on
InvcHead1.Company = SalesRep2.Company
And
[Ice].entry(1,SalesRepList,'~') = SalesRep2.SalesRepCode
Or
[Ice].entry(2,SalesRepList,'~') = SalesRep2.SalesRepCode
Or
[Ice].entry(3,SalesRepList,'~') = SalesRep2.SalesRepCode
Or
[Ice].entry(4,SalesRepList,'~') = SalesRep2.SalesRepCode
Or
[Ice].entry(5,SalesRepList,'~') = SalesRep2.SalesRepCode
and ( SalesRep2.RoleCode = 'mfgrep' )
where (Sales_Base5.Calculated_InvcDtl_ExtPrice <> 0 and Sales_Base5.InvcDtl_ProdCode <> ''))
,[Total] AS
(select
[Sales_Base_Add_MR3].[Calculated_A_InvoiceNum] as [Calculated_A_InvoiceNum],
(sum( Sales_Base_Add_MR3.Calculated_A_ExtPrice )) as [Calculated_Invoice_Total]
from Sales_Base_Add_MR as Sales_Base_Add_MR3
group by [Sales_Base_Add_MR3].[Calculated_A_InvoiceNum])
,[Key1] AS
(select
(Sales_Base_Add_MR.Calculated_A_SalesRepName) as [Calculated_Key1_SR],
(Sales_Base_Add_MR.Calculated_A_SalesRepName + Sales_Base_Add_MR.SalesRep2_Name) as [Calculated_Key1_Key]
from Sales_Base_Add_MR as Sales_Base_Add_MR
where (Sales_Base_Add_MR.SalesRep2_RoleCode = 'mfgrep')
group by (Sales_Base_Add_MR.Calculated_A_SalesRepName) as [Calculated_Key1_SR],
(Sales_Base_Add_MR.Calculated_A_SalesRepName + Sales_Base_Add_MR.SalesRep2_Name) as [Calculated_Key1_Key])
,[Key2] AS
(select
(Sales_Base_Add_MR2.Calculated_A_SalesRepName) as [Calculated_Key2_SR],
(Sales_Base_Add_MR2.Calculated_A_SalesRepName + Sales_Base_Add_MR2.Calculated_A_BTCustID) as [Calculated_Key2_Key]
from Sales_Base_Add_MR as Sales_Base_Add_MR2
where (Sales_Base_Add_MR2.Calculated_A_BTGroupCode in ('dend', 'flxd', 'medd', 'prsd'))
group by (Sales_Base_Add_MR2.Calculated_A_SalesRepName) as [Calculated_Key2_SR],
(Sales_Base_Add_MR2.Calculated_A_SalesRepName + Sales_Base_Add_MR2.Calculated_A_BTCustID) as [Calculated_Key2_Key])
,[B] AS
(select
(Sales_Base_Add_MR14.Calculated_A_SalesRepCode) as [Calculated_B_SalesRepCode],
(Sales_Base_Add_MR14.Calculated_A_SalesRepName) as [Calculated_B_SalesRepName],
(Sales_Base_Add_MR14.Calculated_A_InvoiceNum) as [Calculated_B_InvoiceNum],
(Sales_Base_Add_MR14.Calculated_A_InvoiceDate) as [Calculated_B_InvoiceDate],
(Sales_Base_Add_MR14.Calculated_A_PONum) as [Calculated_B_PONum],
(Total.Calculated_Invoice_Total) as [Calculated_B_OrderTotal],
(Sales_Base_Add_MR14.Calculated_A_CustID) as [Calculated_B_CustID],
(Sales_Base_Add_MR14.Calculated_A_Cust) as [Calculated_B_Cust],
(Sales_Base_Add_MR14.Calculated_A_RoleCode) as [Calculated_B_RoleCode],
(Sales_Base_Add_MR14.Calculated_A_GroupCode) as [Calculated_B_GroupCode],
(Sales_Base_Add_MR14.Calculated_A_Today) as [Calculated_B_Today],
(Sales_Base_Add_MR14.Calculated_A_BOM) as [Calculated_B_BOM],
(Sales_Base_Add_MR14.Calculated_A_BOQ) as [Calculated_B_BOQ],
(Sales_Base_Add_MR14.Calculated_A_BOY) as [Calculated_B_BOY],
(Sales_Base_Add_MR14.Calculated_A_BTCustID) as [Calculated_B_BTCustID],
(Sales_Base_Add_MR14.Calculated_A_BTCust) as [Calculated_B_BTCust],
(Sales_Base_Add_MR14.Calculated_A_BTGroupCode) as [Calculated_B_BTGroupCode],
(Sales_Base_Add_MR14.SalesRep2_SalesRepCode) as [Calculated_B_MRCode],
(Sales_Base_Add_MR14.SalesRep2_Name) as [Calculated_B_MRName],
(Sales_Base_Add_MR14.SalesRep2_RoleCode) as [Calculated_B_MRRoleCode],
(Sales_Base_Add_MR14.Calculated_A_Email) as [Calculated_B_Email],
(Key1.Calculated_Key1_Key) as [Calculated_B_Key],
(Key2.Calculated_Key2_Key) as [Calculated_B_Key2]
from Sales_Base_Add_MR as Sales_Base_Add_MR14
left outer join Key1 as Key1 on
Sales_Base_Add_MR14.Calculated_A_SalesRepName = Key1.Calculated_Key1_SR
And
Calculated_A_SalesRepName + SalesRep2_Name = Key1.Calculated_Key1_Key
left outer join Key2 as Key2 on
Sales_Base_Add_MR14.Calculated_A_SalesRepName = Key2.Calculated_Key2_SR
And
Calculated_A_SalesRepName + Calculated_A_BTCustID = Key2.Calculated_Key2_Key
left outer join Total as Total on
Sales_Base_Add_MR14.Calculated_A_InvoiceNum = Total.Calculated_A_InvoiceNum
group by (Sales_Base_Add_MR14.Calculated_A_SalesRepCode) as [Calculated_B_SalesRepCode],
(Sales_Base_Add_MR14.Calculated_A_SalesRepName) as [Calculated_B_SalesRepName],
(Sales_Base_Add_MR14.Calculated_A_InvoiceNum) as [Calculated_B_InvoiceNum],
(Sales_Base_Add_MR14.Calculated_A_InvoiceDate) as [Calculated_B_InvoiceDate],
(Sales_Base_Add_MR14.Calculated_A_PONum) as [Calculated_B_PONum],
(Total.Calculated_Invoice_Total) as [Calculated_B_OrderTotal],
(Sales_Base_Add_MR14.Calculated_A_CustID) as [Calculated_B_CustID],
(Sales_Base_Add_MR14.Calculated_A_Cust) as [Calculated_B_Cust],
(Sales_Base_Add_MR14.Calculated_A_RoleCode) as [Calculated_B_RoleCode],
(Sales_Base_Add_MR14.Calculated_A_GroupCode) as [Calculated_B_GroupCode],
(Sales_Base_Add_MR14.Calculated_A_Today) as [Calculated_B_Today],
(Sales_Base_Add_MR14.Calculated_A_BOM) as [Calculated_B_BOM],
(Sales_Base_Add_MR14.Calculated_A_BOQ) as [Calculated_B_BOQ],
(Sales_Base_Add_MR14.Calculated_A_BOY) as [Calculated_B_BOY],
(Sales_Base_Add_MR14.Calculated_A_BTCustID) as [Calculated_B_BTCustID],
(Sales_Base_Add_MR14.Calculated_A_BTCust) as [Calculated_B_BTCust],
(Sales_Base_Add_MR14.Calculated_A_BTGroupCode) as [Calculated_B_BTGroupCode],
(Sales_Base_Add_MR14.SalesRep2_SalesRepCode) as [Calculated_B_MRCode],
(Sales_Base_Add_MR14.SalesRep2_Name) as [Calculated_B_MRName],
(Sales_Base_Add_MR14.SalesRep2_RoleCode) as [Calculated_B_MRRoleCode],
(Sales_Base_Add_MR14.Calculated_A_Email) as [Calculated_B_Email],
(Key1.Calculated_Key1_Key) as [Calculated_B_Key],
(Key2.Calculated_Key2_Key) as [Calculated_B_Key2])
,[Sales_BOM] AS
(select
(B1.Calculated_B_SalesRepName) as [Calculated_Sales_BOM_Rep],
(sum( B1.Calculated_B_OrderTotal )) as [Calculated_Sales_BOM_Sum]
from B as B1
where (B1.Calculated_B_InvoiceDate >= B1.Calculated_B_BOM and B1.Calculated_B_InvoiceDate <= B1.Calculated_B_Today)
group by (B1.Calculated_B_SalesRepName) as [Calculated_Sales_BOM_Rep])
,[Sales_BOQ] AS
(select
(B2.Calculated_B_SalesRepName) as [Calculated_Sales_BOQ_Rep],
(sum( B2.Calculated_B_OrderTotal )) as [Calculated_Sales_BOQ_Sum]
from B as B2
where (B2.Calculated_B_InvoiceDate >= B2.Calculated_B_BOQ and B2.Calculated_B_InvoiceDate <= B2.Calculated_B_Today)
group by (B2.Calculated_B_SalesRepName) as [Calculated_Sales_BOQ_Rep])
,[Sales_BOY] AS
(select
(B3.Calculated_B_SalesRepName) as [Calculated_Sales_BOY_Rep],
(sum( B3.Calculated_B_OrderTotal )) as [Calculated_Sales_BOY_Sum]
from B as B3
where (B3.Calculated_B_InvoiceDate >= B3.Calculated_B_BOY and B3.Calculated_B_InvoiceDate <= B3.Calculated_B_Today)
group by (B3.Calculated_B_SalesRepName) as [Calculated_Sales_BOY_Rep])
,[MR_BOM] AS
(select
(sum( B5.Calculated_B_OrderTotal )) as [Calculated_MR_BOM_Sum],
(B5.Calculated_B_Key) as [Calculated_MR_BOM_Key]
from B as B5
where (B5.Calculated_B_InvoiceDate >= B5.Calculated_B_BOM and B5.Calculated_B_InvoiceDate <= B5.Calculated_B_Today and B5.Calculated_B_MRRoleCode = 'mfgrep')
group by (B5.Calculated_B_Key) as [Calculated_MR_BOM_Key])
,[MR_BOQ] AS
(select
(sum( B6.Calculated_B_OrderTotal )) as [Calculated_MR_BOQ_Sum],
(B6.Calculated_B_Key) as [Calculated_MR_BOQ_Key]
from B as B6
where (B6.Calculated_B_InvoiceDate >= B6.Calculated_B_BOQ and B6.Calculated_B_InvoiceDate <= B6.Calculated_B_Today and B6.Calculated_B_MRRoleCode = 'mfgrep')
group by (B6.Calculated_B_Key) as [Calculated_MR_BOQ_Key])
,[MR_BOY] AS
(select
(sum( B7.Calculated_B_OrderTotal )) as [Calculated_MR_BOY_Sum],
(B7.Calculated_B_Key) as [Calculated_MR_BOY_Key],
(B7.Calculated_B_MRName) as [Calculated_MR_BOY_MR]
from B as B7
where (B7.Calculated_B_InvoiceDate >= B7.Calculated_B_BOY and B7.Calculated_B_InvoiceDate <= B7.Calculated_B_Today and B7.Calculated_B_MRRoleCode = 'mfgrep')
group by (B7.Calculated_B_Key) as [Calculated_MR_BOY_Key],
(B7.Calculated_B_MRName) as [Calculated_MR_BOY_MR])
,[Dist_BOM] AS
(select
(sum( B9.Calculated_B_OrderTotal )) as [Calculated_Dist_BOM_Sum],
(B9.Calculated_B_Key2) as [Calculated_Dist_BOM_Key]
from B as B9
where (B9.Calculated_B_InvoiceDate >= B9.Calculated_B_BOM and B9.Calculated_B_InvoiceDate <= B9.Calculated_B_Today and B9.Calculated_B_BTGroupCode in ('dend', 'flxd', 'medd', 'prsd'))
group by (B9.Calculated_B_Key2) as [Calculated_Dist_BOM_Key])
,[Dist_BOQ] AS
(select
(sum( B10.Calculated_B_OrderTotal )) as [Calculated_Dist_BOQ_Sum],
(B10.Calculated_B_Key2) as [Calculated_Dist_BOQ_Key]
from B as B10
where (B10.Calculated_B_InvoiceDate >= B10.Calculated_B_BOQ and B10.Calculated_B_InvoiceDate <= B10.Calculated_B_Today and B10.Calculated_B_BTGroupCode in ('dend', 'flxd', 'medd', 'prsd'))
group by (B10.Calculated_B_Key2) as [Calculated_Dist_BOQ_Key])
,[Dist_BOY] AS
(select
(sum( B11.Calculated_B_OrderTotal )) as [Calculated_Dist_BOY_Sum],
(B11.Calculated_B_Key2) as [Calculated_Dist_BOY_Key],
(B11.Calculated_B_BTCustID) as [Calculated_Dist_BOY_ID],
(B11.Calculated_B_BTCust) as [Calculated_Dist_BOYDist],
(B11.Calculated_B_BTGroupCode) as [Calculated_Dist_BOY_Group]
from B as B11
where (B11.Calculated_B_InvoiceDate >= B11.Calculated_B_BOY and B11.Calculated_B_InvoiceDate <= B11.Calculated_B_Today and B11.Calculated_B_BTGroupCode in ('dend', 'flxd', 'medd', 'prsd'))
group by (B11.Calculated_B_Key2) as [Calculated_Dist_BOY_Key],
(B11.Calculated_B_BTCustID) as [Calculated_Dist_BOY_ID],
(B11.Calculated_B_BTCust) as [Calculated_Dist_BOYDist],
(B11.Calculated_B_BTGroupCode) as [Calculated_Dist_BOY_Group])
,[Sales_Group] AS
(select
(B12.Calculated_B_SalesRepName) as [Calculated_Sales_Group_SR],
(B12.Calculated_B_Email) as [Calculated_Sales_Group_Email]
from B as B12
group by (B12.Calculated_B_SalesRepName) as [Calculated_Sales_Group_SR],
(B12.Calculated_B_Email) as [Calculated_Sales_Group_Email])
,[MR_Group] AS
(select
(B13.Calculated_B_SalesRepName) as [Calculated_MR_Group_SR],
(B13.Calculated_B_Email) as [Calculated_MR_Group_Email],
(B13.Calculated_B_Key) as [Calculated_MR_Group_Key]
from B as B13
where (B13.Calculated_B_Key is not null)
group by (B13.Calculated_B_SalesRepName) as [Calculated_MR_Group_SR],
(B13.Calculated_B_Email) as [Calculated_MR_Group_Email],
(B13.Calculated_B_Key) as [Calculated_MR_Group_Key])
,[Dist_Group] AS
(select
(B15.Calculated_B_SalesRepName) as [Calculated_Dist_Group_SR],
(B15.Calculated_B_Email) as [Calculated_Dist_Group_Email],
(B15.Calculated_B_Key2) as [Calculated_Dist_Group_Key]
from B as B15
where (B15.Calculated_B_Key2 is not null)
group by (B15.Calculated_B_SalesRepName) as [Calculated_Dist_Group_SR],
(B15.Calculated_B_Email) as [Calculated_Dist_Group_Email],
(B15.Calculated_B_Key2) as [Calculated_Dist_Group_Key])
,[Report] AS
(select
(IsNull(B16.Calculated_B_SalesRepCode,'Sales')) as [Calculated_R_SalesRepCode],
(Sales_Group.Calculated_Sales_Group_SR) as [Calculated_R_SalesRepName],
(IsNull(B16.Calculated_B_InvoiceNum,9999999)) as [Calculated_R_InvoiceNum],
(IsNull(B16.Calculated_B_InvoiceDate, convert(date, '30991231', 112))) as [Calculated_R_InvoiceDate],
(B16.Calculated_B_PONum) as [Calculated_R_PONum],
(B16.Calculated_B_OrderTotal) as [Calculated_R_InvoiceTotal],
(B16.Calculated_B_CustID) as [Calculated_R_CustID],
(B16.Calculated_B_Cust) as [Calculated_R_Cust],
(B16.Calculated_B_RoleCode) as [Calculated_R_RoleCode],
(B16.Calculated_B_GroupCode) as [Calculated_R_GroupCode],
(B16.Calculated_B_BTCustID) as [Calculated_R_BTCustID],
(B16.Calculated_B_BTCust) as [Calculated_R_BTCust],
(B16.Calculated_B_BTGroupCode) as [Calculated_R_BTGroupCode],
(B16.Calculated_B_MRCode) as [Calculated_R_MRCode],
(B16.Calculated_B_MRName) as [Calculated_R_MRName],
(B16.Calculated_B_MRRoleCode) as [Calculated_R_MRRoleCode],
(Sales_Group.Calculated_Sales_Group_Email) as [Calculated_R_Email],
(B16.Calculated_B_Key) as [Calculated_R_Key],
(B16.Calculated_B_Key2) as [Calculated_R_Key2],
(Sales_BOM.Calculated_Sales_BOM_Sum) as [Calculated_R_SalesBOM],
(Sales_BOQ.Calculated_Sales_BOQ_Sum) as [Calculated_R_SalesBOQ],
(Sales_BOY.Calculated_Sales_BOY_Sum) as [Calculated_R_SalesBOY],
(NULL) as [Calculated_R_MRBOM],
(NULL) as [Calculated_R_MRBOQ],
(NULL) as [Calculated_R_MRBOY],
(NULL) as [Calculated_R_DistBOM],
(NULL) as [Calculated_R_DistBOQ],
(NULL) as [Calculated_R_DistBOY]
from Sales_Group as Sales_Group
left outer join B as B16 on
Sales_Group.Calculated_Sales_Group_SR = B16.Calculated_B_SalesRepName
and ( B16.Calculated_B_Key is null and B16.Calculated_B_Key2 is null and B16.Calculated_B_InvoiceDate >= B16.Calculated_B_BOM and B16.Calculated_B_InvoiceDate <= B16.Calculated_B_Today )
left outer join Sales_BOM as Sales_BOM on
Sales_Group.Calculated_Sales_Group_SR = Sales_BOM.Calculated_Sales_BOM_Rep
left outer join Sales_BOQ as Sales_BOQ on
Sales_Group.Calculated_Sales_Group_SR = Sales_BOQ.Calculated_Sales_BOQ_Rep
left outer join Sales_BOY as Sales_BOY on
Sales_Group.Calculated_Sales_Group_SR = Sales_BOY.Calculated_Sales_BOY_Rep
UNION
select
(B17.Calculated_B_SalesRepCode) as [Calculated_C_1],
(MR_Group.Calculated_MR_Group_SR) as [Calculated_C_2],
(B17.Calculated_B_InvoiceNum) as [Calculated_C_3],
(B17.Calculated_B_InvoiceDate) as [Calculated_C_4],
(B17.Calculated_B_PONum) as [Calculated_C_5],
(B17.Calculated_B_OrderTotal) as [Calculated_C_6],
(B17.Calculated_B_CustID) as [Calculated_C_9],
(B17.Calculated_B_Cust) as [Calculated_C_10],
(B17.Calculated_B_RoleCode) as [Calculated_C_13],
(B17.Calculated_B_GroupCode) as [Calculated_C_14],
(B17.Calculated_B_BTCustID) as [Calculated_C_15],
(B17.Calculated_B_BTCust) as [Calculated_C_16],
(B17.Calculated_B_BTGroupCode) as [Calculated_C_17],
(B17.Calculated_B_MRCode) as [Calculated_C_20],
(IsNull(B17.Calculated_B_MRName,MR_BOY.Calculated_MR_BOY_MR)) as [Calculated_C_21],
(B17.Calculated_B_MRRoleCode) as [Calculated_C_22],
(MR_Group.Calculated_MR_Group_Email) as [Calculated_C_23],
(MR_Group.Calculated_MR_Group_Key) as [Calculated_C_24],
(B17.Calculated_B_Key2) as [Calculated_C_25],
(Sales_BOM2.Calculated_Sales_BOM_Sum) as [Calculated_C_27],
(Sales_BOQ2.Calculated_Sales_BOQ_Sum) as [Calculated_C_28],
(Sales_BOY2.Calculated_Sales_BOY_Sum) as [Calculated_C_29],
(MR_BOM.Calculated_MR_BOM_Sum) as [Calculated_C_31],
(MR_BOQ.Calculated_MR_BOQ_Sum) as [Calculated_C_32],
(MR_BOY.Calculated_MR_BOY_Sum) as [Calculated_C_33],
(NULL) as [Calculated_C_35],
(NULL) as [Calculated_C_36],
(NULL) as [Calculated_C_37]
from MR_Group as MR_Group
left outer join B as B17 on
MR_Group.Calculated_MR_Group_Key = B17.Calculated_B_Key
and ( B17.Calculated_B_InvoiceDate >= B17.Calculated_B_BOM and B17.Calculated_B_InvoiceDate <= B17.Calculated_B_Today )
left outer join MR_BOM as MR_BOM on
MR_Group.Calculated_MR_Group_Key = MR_BOM.Calculated_MR_BOM_Key
left outer join MR_BOQ as MR_BOQ on
MR_Group.Calculated_MR_Group_Key = MR_BOQ.Calculated_MR_BOQ_Key
left outer join MR_BOY as MR_BOY on
MR_Group.Calculated_MR_Group_Key = MR_BOY.Calculated_MR_BOY_Key
left outer join Sales_BOM as Sales_BOM2 on
MR_Group.Calculated_MR_Group_SR = Sales_BOM2.Calculated_Sales_BOM_Rep
left outer join Sales_BOQ as Sales_BOQ2 on
MR_Group.Calculated_MR_Group_SR = Sales_BOQ2.Calculated_Sales_BOQ_Rep
left outer join Sales_BOY as Sales_BOY2 on
MR_Group.Calculated_MR_Group_SR = Sales_BOY2.Calculated_Sales_BOY_Rep
UNION
select
(B18.Calculated_B_SalesRepCode) as [Calculated_D_1],
(Dist_Group.Calculated_Dist_Group_SR) as [Calculated_D_2],
(B18.Calculated_B_InvoiceNum) as [Calculated_D_3],
(B18.Calculated_B_InvoiceDate) as [Calculated_D_4],
(B18.Calculated_B_PONum) as [Calculated_D_5],
(B18.Calculated_B_OrderTotal) as [Calculated_D_6],
(B18.Calculated_B_CustID) as [Calculated_D_9],
(B18.Calculated_B_Cust) as [Calculated_D_10],
(B18.Calculated_B_RoleCode) as [Calculated_D_13],
(B18.Calculated_B_GroupCode) as [Calculated_D_14],
(IsNull(B18.Calculated_B_BTCustID,Dist_BOY.Calculated_Dist_BOY_ID)) as [Calculated_D_15],
(IsNull(B18.Calculated_B_BTCust,Dist_BOY.Calculated_Dist_BOYDist)) as [Calculated_D_16],
(IsNull(B18.Calculated_B_BTGroupCode,Dist_BOY.Calculated_Dist_BOY_Group)) as [Calculated_D_17],
(B18.Calculated_B_MRCode) as [Calculated_D_20],
(B18.Calculated_B_MRName) as [Calculated_D_21],
(B18.Calculated_B_MRRoleCode) as [Calculated_D_22],
(Dist_Group.Calculated_Dist_Group_Email) as [Calculated_D_23],
(B18.Calculated_B_Key) as [Calculated_D_24],
(Dist_Group.Calculated_Dist_Group_Key) as [Calculated_D_25],
(Sales_BOM1.Calculated_Sales_BOM_Sum) as [Calculated_D_27],
(Sales_BOQ1.Calculated_Sales_BOQ_Sum) as [Calculated_D_28],
(Sales_BOY1.Calculated_Sales_BOY_Sum) as [Calculated_D_29],
(NULL) as [Calculated_D_31],
(NULL) as [Calculated_D_32],
(NULL) as [Calculated_D_33],
(Dist_BOM.Calculated_Dist_BOM_Sum) as [Calculated_D_35],
(Dist_BOQ.Calculated_Dist_BOQ_Sum) as [Calculated_D_36],
(Dist_BOY.Calculated_Dist_BOY_Sum) as [Calculated_D_37]
from Dist_Group as Dist_Group
left outer join B as B18 on
Dist_Group.Calculated_Dist_Group_Key = B18.Calculated_B_Key2
and ( B18.Calculated_B_InvoiceDate >= B18.Calculated_B_BOM and B18.Calculated_B_InvoiceDate <= B18.Calculated_B_Today )
left outer join Dist_BOM as Dist_BOM on
Dist_Group.Calculated_Dist_Group_Key = Dist_BOM.Calculated_Dist_BOM_Key
left outer join Dist_BOQ as Dist_BOQ on
Dist_Group.Calculated_Dist_Group_Key = Dist_BOQ.Calculated_Dist_BOQ_Key
left outer join Dist_BOY as Dist_BOY on
Dist_Group.Calculated_Dist_Group_Key = Dist_BOY.Calculated_Dist_BOY_Key
left outer join Sales_BOM as Sales_BOM1 on
Dist_Group.Calculated_Dist_Group_SR = Sales_BOM1.Calculated_Sales_BOM_Rep
left outer join Sales_BOQ as Sales_BOQ1 on
Dist_Group.Calculated_Dist_Group_SR = Sales_BOQ1.Calculated_Sales_BOQ_Rep
left outer join Sales_BOY as Sales_BOY1 on
Dist_Group.Calculated_Dist_Group_SR = Sales_BOY1.Calculated_Sales_BOY_Rep)
select
[Report].[Calculated_R_SalesRepCode] as [Calculated_R_SalesRepCode],
[Report].[Calculated_R_SalesRepName] as [Calculated_R_SalesRepName],
[Report].[Calculated_R_InvoiceNum] as [Calculated_R_InvoiceNum],
[Report].[Calculated_R_InvoiceDate] as [Calculated_R_InvoiceDate],
[Report].[Calculated_R_PONum] as [Calculated_R_PONum],
[Report].[Calculated_R_InvoiceTotal] as [Calculated_R_InvoiceTotal],
[Report].[Calculated_R_CustID] as [Calculated_R_CustID],
[Report].[Calculated_R_Cust] as [Calculated_R_Cust],
[Report].[Calculated_R_RoleCode] as [Calculated_R_RoleCode],
[Report].[Calculated_R_GroupCode] as [Calculated_R_GroupCode],
[Report].[Calculated_R_BTCustID] as [Calculated_R_BTCustID],
[Report].[Calculated_R_BTCust] as [Calculated_R_BTCust],
[Report].[Calculated_R_BTGroupCode] as [Calculated_R_BTGroupCode],
[Report].[Calculated_R_MRCode] as [Calculated_R_MRCode],
[Report].[Calculated_R_MRName] as [Calculated_R_MRName],
[Report].[Calculated_R_MRRoleCode] as [Calculated_R_MRRoleCode],
[Report].[Calculated_R_Email] as [Calculated_R_Email],
[Report].[Calculated_R_Key] as [Calculated_R_Key],
[Report].[Calculated_R_Key2] as [Calculated_R_Key2],
[Report].[Calculated_R_SalesBOM] as [Calculated_R_SalesBOM],
[Report].[Calculated_R_SalesBOQ] as [Calculated_R_SalesBOQ],
[Report].[Calculated_R_SalesBOY] as [Calculated_R_SalesBOY],
[Report].[Calculated_R_MRBOM] as [Calculated_R_MRBOM],
[Report].[Calculated_R_MRBOQ] as [Calculated_R_MRBOQ],
[Report].[Calculated_R_MRBOY] as [Calculated_R_MRBOY],
[Report].[Calculated_R_DistBOM] as [Calculated_R_DistBOM],
[Report].[Calculated_R_DistBOQ] as [Calculated_R_DistBOQ],
[Report].[Calculated_R_DistBOY] as [Calculated_R_DistBOY]
from Report as Report
a) Look for simplifying parts of the query. For example, this part can be vastly simplified:
(case
when DatePart(month,Constants.Today) = 1 then Constants.FirstDayOfMonth
when DatePart(month,Constants.Today) = 2 then DateAdd(month,-1,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 3 then DateAdd(month,-2,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 4 then DateAdd(month,-3,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 5 then DateAdd(month,-4,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 6 then DateAdd(month,-5,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 7 then DateAdd(month,-6,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 8 then DateAdd(month,-7,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 9 then DateAdd(month,-8,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 10 then DateAdd(month,-9,Constants.FirstDayOfMonth)
when DatePart(month,Constants.Today) = 11 then DateAdd(month,-10,Constants.FirstDayOfMonth)
else DateAdd(month,-11,Constants.FirstDayOfMonth)
end) as [Calculated_BOY],
Could be instead
(case
when DatePart(month,Constants.Today) = 12 then Constants.FirstDayOfMonth
else DateAdd(month, - ( DatePart(month,Constants.Today) - 1), Constants.FirstDayOfMonth) end ) as [Calculated_BOY]
b) Separate the subselects into temporary tables, particularly those that you can verify produce relatively small resultsets (let's say thousand of rows or less). Providing those temporary tables to the select instead of subselects will help the query processor
I really wonder what is
[Ice].entry(1,SalesRepList,'~')
if it is a function, you can work on it.
But it seems to be creating constant values, not dynamic per row
I see that the query is formed of multiple CTE expressions
The Report CTE is formed of UNIONs can be converted to UNION ALLs if possible
And many GROUP By for calculations
Perhaps those can be converted to new aggregation syntax with SUM() function using PARTITION BY clause
its a stored procedure taking the sum of columns now I want to take subtract the values Curr_YTD and Prev_YTD and divide by Prev_YTD.
The stored procedure needs correction.
Kindly let me know if anybody could help with subtract and divide operator.
SELECT B.TEAMNAME, B.PRIMARY_CODE, B.HIERARCHY_LEVEL, A.THERAPEUTICCLASS_CD,
B.PRODUCT_CODE, B.CHANNEL, B.UNIT,'P' PM_INDICATOR, A.PROCESSINGPERIOD_DT,
A.LOCATION_CODE, A.GEOGRAPHY_NAME,party_id, A.TRX_QTY1, A.TRX_QTY2, A.TRX_QTY3, A.TRX_QTY4,
A.TRX_QTY5,A.TRX_QTY6,A.TRX_QTY7,A.TRX_QTY8,A.TRX_QTY9,A.TRX_QTY10,A.TRX_QTY11,
A.TRX_QTY12,A.TRX_QTY13,A.TRX_QTY14,A.TRX_QTY15,A.TRX_QTY16,A.TRX_QTY17,A.TRX_QTY18,
A.TRX_QTY19,A.TRX_QTY20,A.TRX_QTY21, A.TRX_QTY22,A.TRX_QTY23,A.TRX_QTY24,
A.TRX_QTY1+ A.TRX_QTY2+ A.TRX_QTY3+ A.TRX_QTY4+A.TRX_QTY5+A.TRX_QTY6+A.TRX_QTY7+A.TRX_QTY8 Curr_YTD,
A.TRX_QTY13+A.TRX_QTY14+A.TRX_QTY15+A.TRX_QTY16+A.TRX_QTY17+A.TRX_QTY18+A.TRX_QTY19+A.TRX_QTY20 Prev_YTD,
(Curr_YTD Minus Prev_YTD)/Prev_YTD YTD
FROM (SELECT TTP.LILLY_MARKET_ID THERAPEUTICCLASS_CD,
TO_DATE(XPS.PROCESSINGPERIOD_DT, 'MM / DD / YYYY') PROCESSINGPERIOD_DT,
TTP.PRIMARY_CD PRIMARY_CODE,
TLP.LOCATION_CODE,
RTRIM(TLP.Geography_name) GEOGRAPHY_NAME,
ttp.party_id,
SUM(XPS.TRX_QTY1) TRX_QTY1,SUM(XPS.TRX_QTY2) TRX_QTY2,SUM(XPS.TRX_QTY3) TRX_QTY3,
SUM(XPS.TRX_QTY4) TRX_QTY4,SUM(XPS.TRX_QTY5) TRX_QTY5,SUM(XPS.TRX_QTY6) TRX_QTY6,
SUM(XPS.TRX_QTY7) TRX_QTY7,SUM(XPS.TRX_QTY8) TRX_QTY8,SUM(XPS.TRX_QTY9) TRX_QTY9,
SUM(XPS.TRX_QTY10) TRX_QTY10,SUM(XPS.TRX_QTY11) TRX_QTY11,SUM(XPS.TRX_QTY12) TRX_QTY12,
SUM(XPS.TRX_QTY13) TRX_QTY13,SUM(XPS.TRX_QTY14) TRX_QTY14,SUM(XPS.TRX_QTY15) TRX_QTY15,
SUM(XPS.TRX_QTY16) TRX_QTY16,SUM(XPS.TRX_QTY17) TRX_QTY17,SUM(XPS.TRX_QTY18) TRX_QTY18,
SUM(XPS.TRX_QTY19) TRX_QTY19,SUM(XPS.TRX_QTY20) TRX_QTY20,SUM(XPS.TRX_QTY21) TRX_QTY21,
SUM(XPS.TRX_QTY22) TRX_QTY22,SUM(XPS.TRX_QTY23) TRX_QTY23,SUM(XPS.TRX_QTY24) TRX_QTY24
FROM T_SALECRDTNG_XPS_48861 XPS,
T_SALECRDTNG_TTP_49354 TTP,
T_SALESCRD_LOCTNMAPNG TLP
WHERE TTP.PARTY_ID = XPS.PRFSNL_ID
AND TTP.LILLY_MARKET_ID = XPS.LLY_THERAPEUTICCLASS_CD
AND TLP.MAPPINGID = 48871
and TLP.PRIMARY_CODE = 'USUA'
AND XPS.PRODUCT_ID IN ('10210','10215')
AND XPS.LLY_PRODUCT_ID IN ('203825','208142')
AND TLP.LOCATION_CODE = TRIM(TTP.MASTER_GEO_ID)
AND TTP.PRIMARY_CD = TLP.PRIMARY_CODE
group by TTP.LILLY_MARKET_ID,
TTP.PRIMARY_CD,
TO_DATE(XPS.PROCESSINGPERIOD_DT, 'MM / DD / YYYY'),
TLP.LOCATION_CODE,
ttp.party_id,
TLP.Geography_name) A,
(SELECT DISTINCT UPPER(SC.TEAMNAME) TEAMNAME,
DECODE(SC.HIERARCHY_LEVEL, 'TERRITORY', 3, 'DISTRICT', 2, 'AREA', 1, 'REGION',
6,'DIVISION',0, NULL) HIERARCHY_LEVEL,
SC.PRODUCT_CODE PRODUCT_CODE,
SC.PRIMARY_CODE PRIMARY_CODE,
SC.CHANNEL CHANNEL,
SC.UNIT UNIT
FROM T_SALESCRDNG_CONFIG SC
WHERE SC.CONFIGID = 48994
AND SC.PRIMARY_CODE = 'USUA'
AND SC.PRODUCT_CODE = 'CIALIS TOTAL') B
WHERE A.PRIMARY_CODE = B.PRIMARY_CODE
;
Just add a SELCET and make your existing query a sub-query, something like this
SELECT rs.TEAMNAME, rs.PRIMARY_CODE, rs.HIERARCHY_LEVEL, rs.THERAPEUTICCLASS_CD,
rs.PRODUCT_CODE, rs.CHANNEL, rs.UNIT,rs.PM_INDICATOR, rs.PROCESSINGPERIOD_DT,
rs.LOCATION_CODE, rs.GEOGRAPHY_NAME,rs.party_id, rs.TRX_QTY1, rs.TRX_QTY2, rs.TRX_QTY3, rs.TRX_QTY4,
rs.TRX_QTY5,rs.TRX_QTY6,rs.TRX_QTY7,rs.TRX_QTY8,rs.TRX_QTY9,rs.TRX_QTY10,rs.TRX_QTY11,
rs.TRX_QTY12,rs.TRX_QTY13,rs.TRX_QTY14,rs.TRX_QTY15,rs.TRX_QTY16,rs.TRX_QTY17,rs.TRX_QTY18,
rs.TRX_QTY19,rs.TRX_QTY20,rs.TRX_QTY21, rs.TRX_QTY22,rs.TRX_QTY23,rs.TRX_QTY24,
rs.Curr_YTD, rs.Prev_YTD,
(rs.Curr_YTD - rs.Prev_YTD)/rs.Prev_YTD YTD
FROM
(
SELECT B.TEAMNAME, B.PRIMARY_CODE, B.HIERARCHY_LEVEL, A.THERAPEUTICCLASS_CD,
B.PRODUCT_CODE, B.CHANNEL, B.UNIT,'P' PM_INDICATOR, A.PROCESSINGPERIOD_DT,
A.LOCATION_CODE, A.GEOGRAPHY_NAME,party_id, A.TRX_QTY1, A.TRX_QTY2, A.TRX_QTY3, A.TRX_QTY4,
A.TRX_QTY5,A.TRX_QTY6,A.TRX_QTY7,A.TRX_QTY8,A.TRX_QTY9,A.TRX_QTY10,A.TRX_QTY11,
A.TRX_QTY12,A.TRX_QTY13,A.TRX_QTY14,A.TRX_QTY15,A.TRX_QTY16,A.TRX_QTY17,A.TRX_QTY18,
A.TRX_QTY19,A.TRX_QTY20,A.TRX_QTY21, A.TRX_QTY22,A.TRX_QTY23,A.TRX_QTY24,
A.TRX_QTY1+ A.TRX_QTY2+ A.TRX_QTY3+ A.TRX_QTY4+A.TRX_QTY5+A.TRX_QTY6+A.TRX_QTY7+A.TRX_QTY8 Curr_YTD,
A.TRX_QTY13+A.TRX_QTY14+A.TRX_QTY15+A.TRX_QTY16+A.TRX_QTY17+A.TRX_QTY18+A.TRX_QTY19+A.TRX_QTY20 Prev_YTD
FROM (SELECT TTP.LILLY_MARKET_ID THERAPEUTICCLASS_CD,
TO_DATE(XPS.PROCESSINGPERIOD_DT, 'MM / DD / YYYY') PROCESSINGPERIOD_DT,
TTP.PRIMARY_CD PRIMARY_CODE,
TLP.LOCATION_CODE,
RTRIM(TLP.Geography_name) GEOGRAPHY_NAME,
ttp.party_id,
SUM(XPS.TRX_QTY1) TRX_QTY1,SUM(XPS.TRX_QTY2) TRX_QTY2,SUM(XPS.TRX_QTY3) TRX_QTY3,
SUM(XPS.TRX_QTY4) TRX_QTY4,SUM(XPS.TRX_QTY5) TRX_QTY5,SUM(XPS.TRX_QTY6) TRX_QTY6,
SUM(XPS.TRX_QTY7) TRX_QTY7,SUM(XPS.TRX_QTY8) TRX_QTY8,SUM(XPS.TRX_QTY9) TRX_QTY9,
SUM(XPS.TRX_QTY10) TRX_QTY10,SUM(XPS.TRX_QTY11) TRX_QTY11,SUM(XPS.TRX_QTY12) TRX_QTY12,
SUM(XPS.TRX_QTY13) TRX_QTY13,SUM(XPS.TRX_QTY14) TRX_QTY14,SUM(XPS.TRX_QTY15) TRX_QTY15,
SUM(XPS.TRX_QTY16) TRX_QTY16,SUM(XPS.TRX_QTY17) TRX_QTY17,SUM(XPS.TRX_QTY18) TRX_QTY18,
SUM(XPS.TRX_QTY19) TRX_QTY19,SUM(XPS.TRX_QTY20) TRX_QTY20,SUM(XPS.TRX_QTY21) TRX_QTY21,
SUM(XPS.TRX_QTY22) TRX_QTY22,SUM(XPS.TRX_QTY23) TRX_QTY23,SUM(XPS.TRX_QTY24) TRX_QTY24
FROM T_SALECRDTNG_XPS_48861 XPS,
T_SALECRDTNG_TTP_49354 TTP,
T_SALESCRD_LOCTNMAPNG TLP
WHERE TTP.PARTY_ID = XPS.PRFSNL_ID
AND TTP.LILLY_MARKET_ID = XPS.LLY_THERAPEUTICCLASS_CD
AND TLP.MAPPINGID = 48871
and TLP.PRIMARY_CODE = 'USUA'
AND XPS.PRODUCT_ID IN ('10210','10215')
AND XPS.LLY_PRODUCT_ID IN ('203825','208142')
AND TLP.LOCATION_CODE = TRIM(TTP.MASTER_GEO_ID)
AND TTP.PRIMARY_CD = TLP.PRIMARY_CODE
group by TTP.LILLY_MARKET_ID,
TTP.PRIMARY_CD,
TO_DATE(XPS.PROCESSINGPERIOD_DT, 'MM / DD / YYYY'),
TLP.LOCATION_CODE,
ttp.party_id,
TLP.Geography_name) A,
(SELECT DISTINCT UPPER(SC.TEAMNAME) TEAMNAME,
DECODE(SC.HIERARCHY_LEVEL, 'TERRITORY', 3, 'DISTRICT', 2, 'AREA', 1, 'REGION',
6,'DIVISION',0, NULL) HIERARCHY_LEVEL,
SC.PRODUCT_CODE PRODUCT_CODE,
SC.PRIMARY_CODE PRIMARY_CODE,
SC.CHANNEL CHANNEL,
SC.UNIT UNIT
FROM T_SALESCRDNG_CONFIG SC
WHERE SC.CONFIGID = 48994
AND SC.PRIMARY_CODE = 'USUA'
AND SC.PRODUCT_CODE = 'CIALIS TOTAL') B
WHERE A.PRIMARY_CODE = B.PRIMARY_CODE
) rs
;
What is the rule to calculate daysBetween ??
Try a simple apex code and find something strange.
When two days are compare, if 23hours between them they are 1 day between. Why not 24 hours ?
The test code:
Datetime dt,dt0,dt1;
dt = Date.Today();
dt0 = dt.addHours(23);
dt0 = dt0.addMinutes(-1);
dt1 = dt.addHours(23);
dt1 = dt1.addMinutes(0);
Date d,d0,d1;
d=Date.ValueOf(dt);
d0=Date.ValueOf(dt0);
d1=Date.ValueOf(dt1);
System.debug(dt);
System.debug(d0+'|'+d.daysBetween(d0)); // 0
System.debug(d1+'|'+d.daysBetween(d1)); // 1