# Buggy code
def _aggregate_multiple_funcs(self, arg, _level):
    if isinstance(arg, dict):
        # show the deprecation, but only if we
        # have not shown a higher level one
        # GH 15931
        if isinstance(self._selected_obj, Series) and _level <= 1:
            warnings.warn(
                (
                    "using a dict on a Series for aggregation\n"
                    "is deprecated and will be removed in a future "
                    "version"
                ),
                FutureWarning,
                stacklevel=3,
            )

        columns = list(arg.keys())
        arg = list(arg.items())
    elif any(isinstance(x, (tuple, list)) for x in arg):
        arg = [(x, x) if not isinstance(x, (tuple, list)) else x for x in arg]

        # indicated column order
        columns = lzip(*arg)[0]
    else:
        # list of functions / function names
        columns = []
        for f in arg:
            if isinstance(f, compat.string_types):
                columns.append(f)
            else:
                # protect against callables without names
                columns.append(com._get_callable_name(f))
        arg = lzip(columns, arg)

    results = {}
    for name, func in arg:
        obj = self
        if name in results:
            raise SpecificationError(
                "Function names must be unique, found multiple named %s" % name
            )

        # reset the cache so that we
        # only include the named selection
        if name in self._selected_obj:
            obj = copy.copy(obj)
            obj._reset_cache()
            obj._selection = name
        results[name] = obj.aggregate(func)

    if isinstance(list(compat.itervalues(results))[0], DataFrame):
        # let higher level handle
        if _level:
            return results
        return list(compat.itervalues(results))[0]
    return DataFrame(results, columns=columns)


# Traceback (ValueError)
In [12]: np.random.seed(1234)
In [13]: df = pd.DataFrame(np.random.rand(10, 1),
index=pd.date_range(start='2018-01-01', freq='5H', periods=10))

# This call works fine
In [14]: df.groupby(pd.Grouper(freq='D')).agg(['ohlc', 'sum'])
Out[14]:
0
ohlc                                     sum
open      high       low     close         0
2018-01-01  0.191519  0.785359  0.191519  0.779976  2.816690
2018-01-02  0.272593  0.958139  0.272593  0.875933  3.185001

# Switching the order of ops in agg doesn't work
In [16]: df.groupby(pd.Grouper(freq='D')).agg(['sum', 'ohlc'])
ValueError: no results

# Fixed code
def _aggregate_multiple_funcs(self, arg, _level):
    if isinstance(arg, dict):
        # show the deprecation, but only if we
        # have not shown a higher level one
        # GH 15931
        if isinstance(self._selected_obj, Series) and _level <= 1:
            warnings.warn(
                (
                    "using a dict on a Series for aggregation\n"
                    "is deprecated and will be removed in a future "
                    "version"
                ),
                FutureWarning,
                stacklevel=3,
            )

        columns = list(arg.keys())
        arg = list(arg.items())
    elif any(isinstance(x, (tuple, list)) for x in arg):
        arg = [(x, x) if not isinstance(x, (tuple, list)) else x for x in arg]

        # indicated column order
        columns = lzip(*arg)[0]
    else:
        # list of functions / function names
        columns = []
        for f in arg:
            if isinstance(f, compat.string_types):
                columns.append(f)
            else:
                # protect against callables without names
                columns.append(com._get_callable_name(f))
        arg = lzip(columns, arg)

    results = {}
    for name, func in arg:
        obj = self
        if name in results:
            raise SpecificationError(
                "Function names must be unique, found multiple named %s" % name
            )

        # reset the cache so that we
        # only include the named selection
        if name in self._selected_obj:
            obj = copy.copy(obj)
            obj._reset_cache()
            obj._selection = name
        results[name] = obj.aggregate(func)

    if any(isinstance(x, DataFrame) for x in compat.itervalues(results)):
        # let higher level handle
        if _level:
            return results

    return DataFrame(results, columns=columns)