Malloy Documentation
search

For comparison, it is often interesting to turn a table on it's side. The # transpose tag on a query does just that.

document
source: airports is duckdb.table('../data/airports.parquet') extend {
  measure: airport_count is count()
}

Normal Table

document
run: airports -> {
  group_by: fac_type
  aggregate: 
    airport_count
    californa_count is airport_count { where: state = 'CA' }
    ny_count is airport_count { where: state = 'CA' }
    major_count is airport_count { where: major = 'Y' }
    average_elevation is elevation.avg()
}
QUERY RESULTS
fac_​typeairport_​countcaliforna_​countny_​countmajor_​countaverage_​elevation
AIRPORT13,9255695692701,237.044
HELIPORT5,1353963960950.513
SEAPLANE BASE47312120488.822
ULTRALIGHT125220806.144
STOLPORT862201,375.047
[
  {
    "fac_type": "AIRPORT",
    "airport_count": 13925,
    "californa_count": 569,
    "ny_count": 569,
    "major_count": 270,
    "average_elevation": 1237.0441651705567
  },
  {
    "fac_type": "HELIPORT",
    "airport_count": 5135,
    "californa_count": 396,
    "ny_count": 396,
    "major_count": 0,
    "average_elevation": 950.5125608568646
  },
  {
    "fac_type": "SEAPLANE BASE",
    "airport_count": 473,
    "californa_count": 12,
    "ny_count": 12,
    "major_count": 0,
    "average_elevation": 488.82241014799155
  },
  {
    "fac_type": "ULTRALIGHT",
    "airport_count": 125,
    "californa_count": 2,
    "ny_count": 2,
    "major_count": 0,
    "average_elevation": 806.144
  },
  {
    "fac_type": "STOLPORT",
    "airport_count": 86,
    "californa_count": 2,
    "ny_count": 2,
    "major_count": 0,
    "average_elevation": 1375.046511627907
  }
]
SELECT 
   airports."fac_type" as "fac_type",
   COUNT( 1) as "airport_count",
   (COUNT( CASE WHEN airports."state"='CA' THEN 1 END)) as "californa_count",
   (COUNT( CASE WHEN airports."state"='CA' THEN 1 END)) as "ny_count",
   (COUNT( CASE WHEN airports."major"='Y' THEN 1 END)) as "major_count",
   AVG(airports."elevation") as "average_elevation"
FROM '../data/airports.parquet' as airports
GROUP BY 1
ORDER BY 2 desc NULLS LAST

Transposed Table

Great for comparison

document
# transpose
run: airports -> {
  group_by: fac_type
  aggregate: 
    airport_count
    californa_count is airport_count { where: state = 'CA' }
    ny_count is airport_count { where: state = 'CA' }
    major_count is airport_count { where: major = 'Y' }
    average_elevation is elevation.avg()
}
QUERY RESULTS
fac_​typeAIRPORTHELIPORTSEAPLANE BASEULTRALIGHTSTOLPORT
airport_​count13,9255,13547312586
californa_​count5693961222
ny_​count5693961222
major_​count2700000
average_​elevation1,237.044950.513488.822806.1441,375.047
[
  {
    "fac_type": "AIRPORT",
    "airport_count": 13925,
    "californa_count": 569,
    "ny_count": 569,
    "major_count": 270,
    "average_elevation": 1237.0441651705567
  },
  {
    "fac_type": "HELIPORT",
    "airport_count": 5135,
    "californa_count": 396,
    "ny_count": 396,
    "major_count": 0,
    "average_elevation": 950.5125608568646
  },
  {
    "fac_type": "SEAPLANE BASE",
    "airport_count": 473,
    "californa_count": 12,
    "ny_count": 12,
    "major_count": 0,
    "average_elevation": 488.82241014799155
  },
  {
    "fac_type": "ULTRALIGHT",
    "airport_count": 125,
    "californa_count": 2,
    "ny_count": 2,
    "major_count": 0,
    "average_elevation": 806.144
  },
  {
    "fac_type": "STOLPORT",
    "airport_count": 86,
    "californa_count": 2,
    "ny_count": 2,
    "major_count": 0,
    "average_elevation": 1375.046511627907
  }
]
SELECT 
   airports."fac_type" as "fac_type",
   COUNT( 1) as "airport_count",
   (COUNT( CASE WHEN airports."state"='CA' THEN 1 END)) as "californa_count",
   (COUNT( CASE WHEN airports."state"='CA' THEN 1 END)) as "ny_count",
   (COUNT( CASE WHEN airports."major"='Y' THEN 1 END)) as "major_count",
   AVG(airports."elevation") as "average_elevation"
FROM '../data/airports.parquet' as airports
GROUP BY 1
ORDER BY 2 desc NULLS LAST