skip to Main Content

I have 3 tables and I want to have a query that gives me the sum of the sales, the sum of the deposits and the difference between them, try this but the records are duplicated.

this is my query:


-- phpMyAdmin SQL Dump
-- version 4.9.11
-- https://www.phpmyadmin.net/
--
-- Servidor: localhost:3306
-- Tiempo de generación: 28-11-2023 a las 16:25:38
-- Versión del servidor: 5.6.41-84.1
-- Versión de PHP: 7.4.33

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Base de datos: `geasacpe_consolidado`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `articulo`
--

CREATE TABLE `articulo` (
  `id_articulo` int(11) NOT NULL,
  `nombre_articulo` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `precio` decimal(10,2) NOT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `articulo`
--

INSERT INTO `articulo` (`id_articulo`, `nombre_articulo`, `precio`, `id_local`) VALUES
(1, 'PREMIUN AVENTURERO', '10.00', 1),
(2, 'REGULAR AVENTURERO', '8.00', 1),
(3, 'GLP AVENTURERO', '5.00', 1),
(4, 'PREMIUN EL FIEL', '12.00', 2),
(5, 'REGULAR EL FIEL', '9.00', 2),
(6, 'GLP EL FIEL', '4.00', 2);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `contometro`
--

CREATE TABLE `contometro` (
  `id_contometro` int(11) NOT NULL,
  `fecha_contometro` date NOT NULL,
  `turno_contometro` int(11) NOT NULL,
  `inicial_contometro` int(11) NOT NULL,
  `final_contometro` int(11) NOT NULL,
  `precio_articulo` decimal(10,3) NOT NULL,
  `id_local` int(11) NOT NULL,
  `id_manguera` int(11) NOT NULL,
  `id_punto` int(11) NOT NULL,
  `id_lado` int(11) NOT NULL,
  `id_articulo` int(11) NOT NULL,
  `id_vendedor` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `contometro`
--

INSERT INTO `contometro` (`id_contometro`, `fecha_contometro`, `turno_contometro`, `inicial_contometro`, `final_contometro`, `precio_articulo`, `id_local`, `id_manguera`, `id_punto`, `id_lado`, `id_articulo`, `id_vendedor`) VALUES
(3, '2023-11-28', 1, 0, 10, '10.000', 1, 1, 1, 1, 1, 1),
(4, '2023-11-28', 1, 0, 8, '8.000', 1, 2, 1, 1, 2, 1),
(5, '2023-11-28', 1, 0, 12, '5.000', 1, 3, 1, 1, 3, 1),
(6, '2023-11-28', 1, 0, 13, '10.000', 1, 4, 1, 2, 1, 1);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `depositoxvendedor`
--

CREATE TABLE `depositoxvendedor` (
  `id_depositoxvendedor` int(11) NOT NULL,
  `fecha_depositoxvendedor` date NOT NULL,
  `turno_depositoxvendedor` int(11) NOT NULL,
  `numero_depositoxvendedor` int(11) NOT NULL,
  `monto_depositoxvendedor` decimal(10,2) NOT NULL,
  `id_tipopago` int(11) NOT NULL,
  `id_vendedor` int(11) NOT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `depositoxvendedor`
--

INSERT INTO `depositoxvendedor` (`id_depositoxvendedor`, `fecha_depositoxvendedor`, `turno_depositoxvendedor`, `numero_depositoxvendedor`, `monto_depositoxvendedor`, `id_tipopago`, `id_vendedor`, `id_local`) VALUES
(1, '2023-11-28', 1, 1, '100.00', 1, 1, 1),
(2, '2023-11-28', 1, 2, '150.00', 2, 1, 1),
(3, '2023-11-28', 1, 3, '50.00', 1, 2, 1),
(4, '2023-11-28', 1, 4, '30.00', 2, 2, 1);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `lado`
--

CREATE TABLE `lado` (
  `id_lado` int(11) NOT NULL,
  `numero_lado` int(11) NOT NULL,
  `id_punto` int(11) NOT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `lado`
--

INSERT INTO `lado` (`id_lado`, `numero_lado`, `id_punto`, `id_local`) VALUES
(1, 1, 1, 1),
(2, 2, 1, 1),
(3, 3, 3, 1),
(4, 4, 3, 1),
(5, 1, 4, 2),
(6, 2, 4, 2),
(7, 3, 2, 2),
(8, 4, 2, 2);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `local`
--

CREATE TABLE `local` (
  `id_local` int(11) NOT NULL,
  `nombre_local` varchar(50) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `local`
--

INSERT INTO `local` (`id_local`, `nombre_local`) VALUES
(1, 'AVENTURERO'),
(2, 'EL FIEL INCOMPRENDIDO');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `manguera`
--

CREATE TABLE `manguera` (
  `id_manguera` int(11) NOT NULL,
  `numero_manguera` int(11) NOT NULL,
  `id_lado` int(11) NOT NULL,
  `id_articulo` int(11) NOT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `manguera`
--

INSERT INTO `manguera` (`id_manguera`, `numero_manguera`, `id_lado`, `id_articulo`, `id_local`) VALUES
(1, 1, 1, 1, 1),
(2, 2, 1, 2, 1),
(3, 3, 1, 3, 1),
(4, 1, 2, 1, 1),
(5, 2, 2, 2, 1),
(6, 3, 2, 3, 1);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `punto`
--

CREATE TABLE `punto` (
  `id_punto` int(11) NOT NULL,
  `marca_punto` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `modelo_punto` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `punto`
--

INSERT INTO `punto` (`id_punto`, `marca_punto`, `modelo_punto`, `id_local`) VALUES
(1, 'GILBARCO AVENTURERO', '3000', 1),
(2, 'TOKEIN EL FIEL', '2000', 2),
(3, 'TOKEIN AVENTURERO', '2000', 1),
(4, 'GILBARCO EL FIEL', '3000', 2);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `puntoxvendedor`
--

CREATE TABLE `puntoxvendedor` (
  `id_puntoxvendedor` int(11) NOT NULL,
  `fecha_puntoxvendedor` date NOT NULL,
  `turno_puntoxvendedor` int(11) NOT NULL,
  `id_punto` int(11) NOT NULL,
  `id_vendedor` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `puntoxvendedor`
--

INSERT INTO `puntoxvendedor` (`id_puntoxvendedor`, `fecha_puntoxvendedor`, `turno_puntoxvendedor`, `id_punto`, `id_vendedor`) VALUES
(1, '2023-11-28', 1, 1, 1),
(2, '2023-11-28', 1, 3, 2);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `vendedor`
--

CREATE TABLE `vendedor` (
  `id_vendedor` int(11) NOT NULL,
  `nombre_vendedor` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `id_local` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Volcado de datos para la tabla `vendedor`
--

INSERT INTO `vendedor` (`id_vendedor`, `nombre_vendedor`, `id_local`) VALUES
(1, 'VENDEDOR 1 AVENTURERO', 1),
(2, 'VENDEDOR 2 AVENTURERO', 1),
(3, 'VENDEDOR 1 EL FIEL', 2),
(4, 'VENDEDOR 2 EL FIEL', 2);

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `articulo`
--
ALTER TABLE `articulo`
  ADD PRIMARY KEY (`id_articulo`),
  ADD KEY `id_local` (`id_local`);

--
-- Indices de la tabla `contometro`
--
ALTER TABLE `contometro`
  ADD PRIMARY KEY (`id_contometro`),
  ADD KEY `id_local` (`id_local`),
  ADD KEY `id_manguera` (`id_manguera`),
  ADD KEY `id_punto` (`id_punto`),
  ADD KEY `id_lado` (`id_lado`),
  ADD KEY `id_articulo` (`id_articulo`),
  ADD KEY `id_vendedor` (`id_vendedor`);

--
-- Indices de la tabla `depositoxvendedor`
--
ALTER TABLE `depositoxvendedor`
  ADD PRIMARY KEY (`id_depositoxvendedor`),
  ADD KEY `id_vendedor` (`id_vendedor`),
  ADD KEY `id_local` (`id_local`);

--
-- Indices de la tabla `lado`
--
ALTER TABLE `lado`
  ADD PRIMARY KEY (`id_lado`),
  ADD KEY `id_punto` (`id_punto`),
  ADD KEY `id_local` (`id_local`);

--
-- Indices de la tabla `local`
--
ALTER TABLE `local`
  ADD PRIMARY KEY (`id_local`);

--
-- Indices de la tabla `manguera`
--
ALTER TABLE `manguera`
  ADD PRIMARY KEY (`id_manguera`),
  ADD KEY `id_lado` (`id_lado`),
  ADD KEY `id_articulo` (`id_articulo`),
  ADD KEY `id_local` (`id_local`);

--
-- Indices de la tabla `punto`
--
ALTER TABLE `punto`
  ADD PRIMARY KEY (`id_punto`),
  ADD KEY `id_local` (`id_local`);

--
-- Indices de la tabla `puntoxvendedor`
--
ALTER TABLE `puntoxvendedor`
  ADD PRIMARY KEY (`id_puntoxvendedor`),
  ADD KEY `id_punto` (`id_punto`),
  ADD KEY `id_vendedor` (`id_vendedor`);

--
-- Indices de la tabla `vendedor`
--
ALTER TABLE `vendedor`
  ADD PRIMARY KEY (`id_vendedor`),
  ADD KEY `id_local` (`id_local`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `articulo`
--
ALTER TABLE `articulo`
  MODIFY `id_articulo` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT de la tabla `contometro`
--
ALTER TABLE `contometro`
  MODIFY `id_contometro` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT de la tabla `depositoxvendedor`
--
ALTER TABLE `depositoxvendedor`
  MODIFY `id_depositoxvendedor` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- AUTO_INCREMENT de la tabla `lado`
--
ALTER TABLE `lado`
  MODIFY `id_lado` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;

--
-- AUTO_INCREMENT de la tabla `local`
--
ALTER TABLE `local`
  MODIFY `id_local` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `manguera`
--
ALTER TABLE `manguera`
  MODIFY `id_manguera` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT de la tabla `punto`
--
ALTER TABLE `punto`
  MODIFY `id_punto` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- AUTO_INCREMENT de la tabla `puntoxvendedor`
--
ALTER TABLE `puntoxvendedor`
  MODIFY `id_puntoxvendedor` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT de la tabla `vendedor`
--
ALTER TABLE `vendedor`
  MODIFY `id_vendedor` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- Restricciones para tablas volcadas
--

--
-- Filtros para la tabla `articulo`
--
ALTER TABLE `articulo`
  ADD CONSTRAINT `articulo_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);

--
-- Filtros para la tabla `contometro`
--
ALTER TABLE `contometro`
  ADD CONSTRAINT `contometro_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`),
  ADD CONSTRAINT `contometro_ibfk_2` FOREIGN KEY (`id_manguera`) REFERENCES `manguera` (`id_manguera`),
  ADD CONSTRAINT `contometro_ibfk_3` FOREIGN KEY (`id_punto`) REFERENCES `punto` (`id_punto`),
  ADD CONSTRAINT `contometro_ibfk_4` FOREIGN KEY (`id_lado`) REFERENCES `lado` (`id_lado`),
  ADD CONSTRAINT `contometro_ibfk_5` FOREIGN KEY (`id_articulo`) REFERENCES `articulo` (`id_articulo`),
  ADD CONSTRAINT `contometro_ibfk_6` FOREIGN KEY (`id_vendedor`) REFERENCES `vendedor` (`id_vendedor`);

--
-- Filtros para la tabla `depositoxvendedor`
--
ALTER TABLE `depositoxvendedor`
  ADD CONSTRAINT `depositoxvendedor_ibfk_1` FOREIGN KEY (`id_vendedor`) REFERENCES `vendedor` (`id_vendedor`),
  ADD CONSTRAINT `depositoxvendedor_ibfk_2` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);

--
-- Filtros para la tabla `lado`
--
ALTER TABLE `lado`
  ADD CONSTRAINT `lado_ibfk_1` FOREIGN KEY (`id_punto`) REFERENCES `punto` (`id_punto`),
  ADD CONSTRAINT `lado_ibfk_2` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);

--
-- Filtros para la tabla `manguera`
--
ALTER TABLE `manguera`
  ADD CONSTRAINT `manguera_ibfk_1` FOREIGN KEY (`id_lado`) REFERENCES `lado` (`id_lado`),
  ADD CONSTRAINT `manguera_ibfk_2` FOREIGN KEY (`id_articulo`) REFERENCES `articulo` (`id_articulo`),
  ADD CONSTRAINT `manguera_ibfk_3` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);

--
-- Filtros para la tabla `punto`
--
ALTER TABLE `punto`
  ADD CONSTRAINT `punto_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);

--
-- Filtros para la tabla `puntoxvendedor`
--
ALTER TABLE `puntoxvendedor`
  ADD CONSTRAINT `puntoxvendedor_ibfk_1` FOREIGN KEY (`id_punto`) REFERENCES `punto` (`id_punto`),
  ADD CONSTRAINT `puntoxvendedor_ibfk_2` FOREIGN KEY (`id_vendedor`) REFERENCES `vendedor` (`id_vendedor`);

--
-- Filtros para la tabla `vendedor`
--
ALTER TABLE `vendedor`
  ADD CONSTRAINT `vendedor_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `local` (`id_local`);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

select C.fecha_contometro as fecha ,C.turno_contometro as turno,V.nombre_vendedor as vendedor, 
sum(DV.monto_depositoxvendedor) as deposito,
sum((C.final_contometro-C.inicial_contometro)*C.precio_articulo) as contometria
from contometro C 
inner join vendedor V on C.id_vendedor=V.id_vendedor
inner join depositoxvendedor DV on DV.id_vendedor=V.id_vendedor
GROUP BY C.id_vendedor

The query gives me this result

the result should be:

Date turno Vendedor Deposito Contometria
28/11/2023 1 VENDEDOR 1 AVENTURERO 250.00 354.00

2

Answers


  1. Try this:

    select  DV.fecha_depositoxvendedor as date,  turno, V.nombre_vendedor as vendedor,
    sum(DV.monto_depositoxvendedor) as deposito,
    any_value(C.contometria) as contometria -- The aggregation function any_value makes the syntax right but logically uncenessary, as the aggregation is already done in the derived table C. Use min or max if function any_value is not available.
    from  
        (select id_vendedor , turno_contometro as turno, sum((final_contometro-inicial_contometro)*precio_articulo) as contometria
        from contometro 
        group by id_vendedor, turno) C
    inner join vendedor V on C.id_vendedor=V.id_vendedor
    inner join depositoxvendedor DV on DV.id_vendedor=V.id_vendedor
    group by vendedor, date, turno  
    ;
    
    -- result
    +------------+-------+-----------------------+----------+-------------+
    | date       | turno | vendedor              | deposito | contometria |
    +------------+-------+-----------------------+----------+-------------+
    | 2023-11-28 |     1 | VENDEDOR 1 AVENTURERO |   250.00 |     354.000 |
    +------------+-------+-----------------------+----------+-------------+
    

    Note, the answer is written with the SQL_MODE value ONLY_FULL_GROUP_BY specified, which DOES NOT allow the select list to have nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on (uniquely determined by) GROUP BY columns. When we have the value in SQL_MODE, if we delete the turno from the group by list at the end of the main query, an error occurs.

    select  DV.fecha_depositoxvendedor as date,  turno, V.nombre_vendedor as vendedor,
    sum(DV.monto_depositoxvendedor) as deposito,
    any_value(C.contometria) as contometria -- The aggregation function any_value makes the syntax right but logically uncenessary, as the aggregation is already done in the derived table C. 
    from  
        (select id_vendedor , turno_contometro as turno, sum((final_contometro-inicial_contometro)*precio_articulo) as contometria
        from contometro 
        group by id_vendedor, turno) C
    inner join vendedor V on C.id_vendedor=V.id_vendedor
    inner join depositoxvendedor DV on DV.id_vendedor=V.id_vendedor
    group by vendedor, date
    ;
    
    -- result:
    ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'C.turno' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    
    

    And if we remove the ONLY_FULL_GROUP_BY, it will run without fail.

    Finally, it’s probably beyond my concerns over the business logic, but I suppose the join condition using id_vendedor only is less satisfactory. Shouldn’t we consider further join condition such as matching date and turno between table contometro and depositoxvendedor ?

    Login or Signup to reply.
  2. The problem is that all the JOINing occurs before any aggregation )sic as SUM()). This may get the correct sums. (Note that it obviates the need for GROUP BY.)

    SELECT  V.nombre_vendedor as vendedor,
            ( SELECT sum(DV.monto_depositoxvendedor)
                FROM depositoxvendedor DV
                WHERE DV.id_vendedor=V.id_vendedor ) as deposito,
            ( SELECT  sum((C.final_contometro - C.inicial_contometro) * C.precio_articulo
                  ) as contometria
        FROM vendedor V
    

    I don’t know how to deal with C.fecha_contometro and C.turno_contometro because these are multiple fechas per vendor, etc. Perhaps MAX(C.fecha_contometro)?

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search