2017-08-22 2 views
0

Cette requête nous fournit l'heure de diverses opérations. À l'heure actuelle, il divise le temps de chaque événement par nom, date et modèle de pelle. Cependant, je cherche à joindre d'une façon ou d'une autre la moyenne de tous les noms d'une équipe dans une nouvelle colonne. Étant nouveau dans le jeu SQL, il serait bien d'avoir une stratégie qui pourrait fournir diverses définitions de moyenne et les retourner à la même table. Une image de la sortie suit ce lien.Recherche d'un moyen de créer plusieurs colonnes qui effectuent la moyenne des données par différents regroupements dans la même requête SQL

https://i.stack.imgur.com/6V5XB.png

DECLARE @start AS DATETIME = '2017-08-15' 

DECLARE @end AS DATETIME = '2017-08-20' 

SELECT * 

FROM ( 

SELECT 

[Name], 
[Date], 
MAX([Crew]) as [Crew], 
MAX([Shovel_ID]) as [Shovel Model], 
CONVERT(DECIMAL(10,1) ,AVG([empty])) as [Empty], 
CONVERT(DECIMAL(10,1) ,AVG([HAUL])) AS [Hauling], 
CONVERT(DECIMAL(10,0) ,AVG([Wait At Dump]*60)) AS [Wait at Dump], 
CONVERT(DECIMAL(10,0) ,AVG([Dumping]*60)) as [Dumping], 
CONVERT(DECIMAL(10,0) ,AVG([Spot at LU]*60)) as [Spot at LU], 
CONVERT(DECIMAL(10,0) ,AVG([Load Time]*60)) AS [Truck Loading], 
CONVERT(DECIMAL(10,0) ,AVG([QUEUE]*60)) as [Wait at Shovel], 
CONVERT(DECIMAL(10,0) ,AVG([Hot Seat]*60)) as [Hot Seat], 
CONVERT(DECIMAL(10,0) ,AVG([Empty Hauling]*60)) as [Empty Stopped], 
CONVERT(DECIMAL(10,0) ,AVG([HAULING STOPPED]*60)) AS [Hauling Stopped] 


FROM (

Select 
haul_cycle, 
max([name]) as [Name], 
max([shovel_id]) as [Shovel_ID], 
max([date]) as [Date], 
max([crew]) as [Crew], 
sum(dumping) as [Dumping], 
sum([spot at lu]) as [Spot at LU], 
sum([wait at dump]) as [Wait at Dump], 
sum([empty]) as [Empty], 
sum([hauling]) as [Haul], 
SUM([Truck Loading]) as [Load Time], 
SUM([Queue at LU]) as [QUEUE], 
SUM([Hot Change]) as [Hot Seat], 
SUM([EMPTY sTOPPED]) AS [Empty Hauling], 
SUM([HAULing STOPPED]) AS [Hauling Stopped], 

SUM([HAULing STOPPED]+[EMPTY STOPPED]+[Queue at LU]+[Truck Loading]+ 
[Hauling]+[Empty]+[Spot at LU]+[wait at dump]+[dumping]) as [Cycle Time], 
COUNT([HAUL_CYCLE]) AS [Number of Cycles] 

FROM (

SELECT 
HAUL_CYCLE_TRANS.HAUL_CYCLE_REC_IDENT as [HAUL_CYCLE], 
CREW_IDENT as [CREW], 
badge.LAST_NAME + ' , ' + badge.FIRST_NAME as [Name], 
DUMP_END_SHIFT_DATE as date , 
DUMP_END_SHIFT_IDENT, 
CAST(EQUIPMENT_STATUS_TRANS.END_TIMESTAMP- 
EQUIPMENT_STATUS_TRANS.START_TIMESTAMP AS FLOAT)*24*60 AS DURATION, 
COALESCE(SUB_STATUS_DESC, STATUS_DESC) AS [Status], 

CASE 
    WHEN HAUL_CYCLE_TRANS.LOADING_UNIT_IDENT IN (4001, 4002, 4005, 4006) 
THEN '6060' 
    ELSE '7495' 
END AS SHOVEL_ID 

FROM HAUL_CYCLE_TRANS 

LEFT JOIN HAUL_UNIT_STATUS_TRANS_COL on 
HAUL_UNIT_STATUS_TRANS_COL.HAUL_CYCLE_REC_IDENT = 
HAUL_CYCLE_TRANS.HAUL_CYCLE_REC_IDENT 

LEFT JOIN EQUIPMENT_STATUS_TRANS on 
EQUIPMENT_STATUS_TRANS.EQUIP_STATUS_REC_IDENT = 
HAUL_UNIT_STATUS_TRANS_COL.EQUIP_STATUS_REC_IDENT 

LEFT JOIN badge on badge.BADGE_IDENT = 
haul_cycle_trans.HAULING_UNIT_BADGE_IDENT 

LEFT JOIN EQUIP_STATUS_CODE on EQUIP_STATUS_CODE.STATUS_CODE = 
EQUIPMENT_STATUS_TRANS.STATUS_CODE 


LEFT JOIN EQUIP_SUB_STATUS_CODE on EQUIP_SUB_STATUS_CODE.SUB_STATUS_CODE = 
EQUIPMENT_STATUS_TRANS.SUB_STATUS_CODE 

WHERE dump_end_shift_date >= @start AND First_Name <> '') raw_data 

PIVOT(SUM(duration) FOR [Status] IN ([Dumping], [Spot at LU],[Wait at Dump], 
[Empty], [Empty Stopped], [Hauling Stopped], [Hauling], [Queue at LU], 
[Truck Loading], [Hot Change])) DATAFIELD 

GROUP BY haul_cycle) SUM_DATA_FOR_EACH_REC 
GROUP BY [name], [date], Shovel_ID 
) AVG_OPERATOR_STATUS 

ORDER BY [NAME],[DATE] 
+0

Marquez les dbms que vous utilisez. Ce code est spécifique au produit! – jarlh

+0

SSMS 2016 - mes excuses – Fishingwest

Répondre

0

Vous pouvez utiliser la fonction OVER (PARTITION BY). De cette façon, vous pouvez utiliser la répartition que vous souhaitez obtenir pour votre moyenne, en partitionnant l'ensemble de données de différentes manières. Vous pouvez en savoir plus sur OVER Clause here.

Exemple:

SELECT 
    DateField 
    ,YourName1 
    ,YourId 
    ,SUM(Value1) 
    ,AVG(Value1) OVER (PARTITION BY DateField) AS DateFieldAverage 
FROM 
    YourTable 
GROUP BY 
    DateField 
    ,YourName1 
    ,YourId 

En supposant que vous utilisez SQL Server (basé sur la syntaxe au-dessus de votre question).