Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Mi solución usando una subconsulta o una view. Y duda con respecto a si la facturación se calcula con impuesto o no

La siguiente consulta nos da la facturación por cliente en cada año.

SELECT 
    YEAR(F.FECHA_VENTA) AS AÑO,
    C.DNI AS DNI_CLIENTE,
    C.NOMBRE AS NOMBRE_CLIENTE,
    ROUND(SUM(IFA.CANTIDAD * IFA.PRECIO), 2) AS FACTURACIÓN
FROM
    FACTURAS F 
INNER JOIN
    TABLA_DE_CLIENTES C
ON 
    F.DNI = C.DNI
INNER JOIN 
    ITEMS_FACTURAS IFA 
ON 
    F.NUMERO = IFA.NUMERO
GROUP BY
    YEAR(F.FECHA_VENTA),
    C.DNI
ORDER BY
    YEAR(F.FECHA_VENTA),
    CAST(C.DNI AS UNSIGNED); -- Otra forma de convertir texto a número

Se debe de agrupar por el año de la venta y por DNI (no por nombre del cliente) ya que pueden existir dos personas llamadas Erica Carvajo pero el DNI es el que las distingue

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Ahora hacemos la subconsulta especificando el año 2016:

SELECT 
    CONCAT('El cliente ',
            NOMBRE_CLIENTE, 
            ' facturó ', 
            CONVERT(FACTURACIÓN, CHAR(20)), 
            ' pesos mexicanos durante el año ', 
            CONVERT(AÑO, CHAR(4))) AS LISTANDO_CON_EXPRESIÓN_NATURAL
FROM (
    SELECT 
        YEAR(F.FECHA_VENTA) AS AÑO,
        C.DNI AS DNI_CLIENTE,
        C.NOMBRE AS NOMBRE_CLIENTE,
        ROUND(SUM(IFA.CANTIDAD * IFA.PRECIO), 2) AS FACTURACIÓN
    FROM 
        FACTURAS F
    INNER JOIN 
         TABLA_DE_CLIENTES C
    ON 
        F.DNI = C.DNI
    INNER JOIN 
        ITEMS_FACTURAS IFA 
    ON 
        F.NUMERO = IFA.NUMERO
    GROUP BY
        YEAR(F.FECHA_VENTA),
        C.DNI
    ORDER BY
        YEAR(F.FECHA_VENTA),
        CAST(C.DNI AS UNSIGNED)) AS FACTURACIÓN_CLIENTE_POR_AÑO
WHERE
    AÑO = 2016;

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Creamos la VIEW de la primer consulta:

CREATE VIEW 
    FACTURACIÓN_CLIENTE_POR_AÑO
AS
    SELECT 
        YEAR(F.FECHA_VENTA) AS AÑO,
        C.DNI AS DNI_CLIENTE,
        C.NOMBRE AS NOMBRE_CLIENTE,
        ROUND(SUM(IFA.CANTIDAD * IFA.PRECIO), 2) AS FACTURACIÓN
    FROM 
        FACTURAS F 
    INNER JOIN 
        TABLA_DE_CLIENTES C
    ON 
        F.DNI = C.DNI
    INNER JOIN 
        ITEMS_FACTURAS IFA 
    ON 
        F.NUMERO = IFA.NUMERO
    GROUP BY
        YEAR(F.FECHA_VENTA),
        C.DNI
    ORDER BY
        YEAR(F.FECHA_VENTA),
        CAST(C.DNI AS UNSIGNED);

Y la usamos para resolver el ejercicio:

SELECT 
    CONCAT('El cliente ',
            NOMBRE_CLIENTE, 
            ' facturó ', 
            CONVERT(FACTURACIÓN, CHAR(20)), 
            ' pesos mexicanos durante el año ', 
            CONVERT(AÑO, CHAR(4))) AS LISTANDO_CON_EXPRESIÓN_NATURAL
FROM 
    FACTURACIÓN_CLIENTE_POR_AÑO
WHERE
    AÑO = 2016;

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Sé que en la VIEW 'FACTURACIÓN_CLIENTE_POR_AÑO' y en la subconsulta podemos filtrar por año (2016) pero lo dejé así para que sea una consulta más general y se pueda filtrar fuera de la VIEW y de la subconsulta.
¿Qué opinan de mi propuesta?

Y me surgió otra duda: ¿La facturación es con el impuesto?
Porque entonces la facturación cambia ya que a todo lo que hice se le debe de agregar el impuesto:

-- Facturación + el impuesto de esa facturación
ROUND(SUM(IFA.CANTIDAD * IFA.PRECIO) + SUM(F.IMPUESTO * IFA.CANTIDAD * IFA.PRECIO), 2) AS FACTURACIÓN, 

Así ya solo se tendrían que cambiar:

  • La línea 8 de la VIEW
  • Y la línea 13 de la consulta que lleva la subconsulta

por el cálculo anterior.

1 respuesta
solución!

¡Hola Estudiante, espero que estés bien!

Tu propuesta de usar una subconsulta o una vista para calcular la facturación por cliente es bastante clara y estructurada. Al dejar el filtro de año fuera de la vista o subconsulta, haces que la consulta sea más flexible y reutilizable para otros años, lo cual es una buena práctica.

Con respecto a tu duda sobre si la facturación incluye impuestos, si el cálculo debe incluir el impuesto, entonces tu modificación para sumar el impuesto a la facturación es correcta. Asegúrate de que el campo IMPUESTO en la tabla FACTURAS representa el porcentaje o valor correcto del impuesto que se debe aplicar.

Aquí está tu modificación sugerida:

ROUND(SUM(IFA.CANTIDAD * IFA.PRECIO) + SUM(F.IMPUESTO * IFA.CANTIDAD * IFA.PRECIO), 2) AS FACTURACIÓN

Solo asegúrate de que F.IMPUESTO sea el valor correcto (por ejemplo, 0.16 para un 16% de impuesto) y que se aplique correctamente en el cálculo.

Espero que esto aclare tus dudas. ¡Espero haber ayudado y buenos estudios!