# system.kanoa.operators.getOLEDataByCrew(assetId, startDate, endDate, attributionMode, output)

Returns one row per sch.crew with a schedule overlapping the range, rolling up OLE/POLE across every
sch.operatorShiftAssignment row stamped with that crewId (at assetId or any descendant asset).
Assignment rows with no crewId (individual, non-crew assignments) are rolled into their own "No Crew"
row (crewId None) rather than excluded, so non-crew labor still gets a metrics row instead of silently
vanishing from the report. Existing per-operator/per-assignment OLE functions (getOLEOperatorLeaderboard,
getOLEDataByShift, etc.) are unaffected by this and keep returning every assignment regardless of crewId.

---
### Parameters
**assetId** `Integer`: site/area to roll crews up under (crews scheduled at this asset or any descendant)<br />
**startDate** `String`<br />
**endDate** `String`<br />
**attributionMode** `String`: 'EvenSplit' (default), 'FullCredit', or 'PrimaryOnly' - controls how counter<br />
**output** `is`: split when multiple crew members are concurrently scheduled<br />

---
### Returns
**oleData** `Dataset` one row per crewId, metrics summed across every member's assignment row and<br />
**OLE/POLE recomputed once from the summed totals** `never averaged per-member ratios`<br />

---
### Example
```python
assetId = 4
startDate = system.date.parse("2026-09-01 00:00:00")
endDate = system.date.parse("2025-10-01 00:00:00")
attributionMode = 'EvenSplit'
data = system.kanoa.operators.getOLEDataByCrew(assetId, startDate, endDate, attributionMode)
```
