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
Try this:
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 theturno
from the group by list at the end of the main query, an error occurs.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 tablecontometro
anddepositoxvendedor
?The problem is that all the
JOINing
occurs before any aggregation )sic asSUM()
). This may get the correct sums. (Note that it obviates the need forGROUP BY
.)I don’t know how to deal with
C.fecha_contometro
andC.turno_contometro
because these are multiple fechas per vendor, etc. PerhapsMAX(C.fecha_contometro)
?