首页 > 解决方案 > Group By 错误:列不包含在聚合函数或 Group By 子句中,但实际上是?

问题描述

由于要参加考试,我正在练习一些 SQL,但遇到了这个错误:

消息 8120,级别 16,状态 1,第 15
行列“DEPOSITO.depo_zona”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

我已经搜索了有关它的所有信息,并且它始终是 count() (或他们使用的任何其他函数)或 group by 中缺少的列。但是,就我而言,“DEPOSITO.depo_zona”列在 group by 中(即使没有必要),所以我在这里摸不着头脑,因为我真的不知道出了什么问题。这是我的代码:

--Cantidad de depósitos en esa zona
(select count(distinct D2.depo_codigo)
from DEPOSITO D2
where D2.depo_zona = D1.depo_zona
group by D2.depo_zona, D2.depo_codigo) CantidadDepositos,

任何帮助将不胜感激!!!

更新:这是整个查询:

--Año
select year(Factura.fact_fecha) Año,
--Código de zona
    Z1.zona_codigo CodigoZona,
--Detalle de la zona
    Z1.zona_detalle DetalleZona,
--Cantidad de depósitos en esa zona
    (select count(distinct D2.depo_codigo)
    from DEPOSITO D2
    where D2.depo_zona = D1.depo_zona
    group by D2.depo_zona, D2.depo_codigo) CantidadDepositos,
--Cantidad de empleados de departamentos de esa zona
    (select count(*)
    from Departamento
        join Empleado on Departamento.depa_codigo = Empleado.empl_departamento
    where Departamento.depa_zona = Z1.zona_codigo) CantidadEmpleados,
--Empleado que más vendió en ese año y esa zona
    (select top 1 Factura.fact_vendedor
    from Item_Factura
        join Factura on Factura.fact_numero = Item_Factura.item_numero
            and Factura.fact_sucursal = Item_Factura.item_sucursal
            and Factura.fact_tipo = Item_Factura.item_tipo
        join STOCK on STOCK.stoc_producto = Item_Factura.item_producto
        join DEPOSITO on DEPOSITO.depo_codigo = STOCK.stoc_deposito
    group by Factura.fact_vendedor
    order by sum(Factura.fact_total) desc) EmpleadoEstrella,
--Monto total de venta de esa zona en ese año
    sum(Factura.fact_total) TotalZona,
--Porcentaje de la venta de ese año en esa zona respecto al total vendido de ese año
    sum(Factura.fact_total) * 100/
    (select sum(F1.fact_total)
    from Factura F1
    where year(F1.fact_fecha) = year(Factura.fact_fecha)) PorcentajeVenta
--Ordenar por año y dentro del año por zona con más facturación de mayor a menor
from Factura
    join Item_Factura on Factura.fact_tipo = Item_Factura.item_tipo
        and Item_Factura.item_sucursal = Factura.fact_sucursal
        and Item_Factura.item_numero = Factura.fact_numero
    join STOCK on STOCK.stoc_producto = Item_Factura.item_producto
    join DEPOSITO D1 on D1.depo_codigo = STOCK.stoc_deposito
    join Zona Z1 on Z1.zona_codigo = D1.depo_zona
group by year(Factura.fact_fecha), Z1.zona_codigo, Z1.zona_detalle
order by year(Factura.fact_fecha), sum(Factura.fact_total) desc

标签: sqlsql-server

解决方案


替换或删除您的子查询count(distinct D2.depo_codigo) 的group by 因为这没有任何意义,您按 2 列分组并同时计算 group by 的列。此外,使用这样的相关子查询是完全错误的,因为对于特定的按列分组,内部选择应该运行,直到该列与外部匹配,这是不可能的,因为即使有一个聚合也会有不一致的行,它会抛出一些其他错误如果您尝试解决此错误,请将其放入连接本身或使用 CTE 方法count (*)D2.depo_codigo

替换 where 它将运行 where 使其成为 select 本身中的关联子查询,这不是使用关联子查询的方式


推荐阅读