Funciones agregadas de SQL: SUMA, MIN, MAX, AVG, COUNT. Los cálculos en sql El servidor Sql cuenta el número de filas.

04.08.2021

Aprendamos a resumir. No, estos no son los resultados del estudio de SQL, sino los resultados de los valores de las columnas de las tablas de la base de datos. Las funciones agregadas de SQL operan sobre los valores de una columna para producir un único valor resultante. Las funciones agregadas de SQL más utilizadas son SUM, MIN, MAX, AVG y COUNT. Es necesario distinguir entre dos casos de uso de funciones agregadas. En primer lugar, las funciones agregadas se utilizan por sí solas y devuelven un único valor de resultado. En segundo lugar, las funciones agregadas se utilizan con la cláusula SQL GROUP BY, es decir, agrupar por campos (columnas) para obtener los valores resultantes en cada grupo. Consideremos primero casos de uso de funciones agregadas sin agrupación.

Función SUMA SQL

La función SQL SUM devuelve la suma de los valores en una columna de la tabla de la base de datos. Sólo se puede aplicar a columnas cuyos valores sean números. Las consultas SQL para obtener la suma resultante comienzan así:

SELECCIONE SUMA (NOMBRE_COLUMNA)...

Esta expresión va seguida de FROM (TABLE_NAME) y luego se puede especificar una condición utilizando la cláusula WHERE. Además, el nombre de la columna puede ir precedido de DISTINCT, lo que significa que solo se contarán los valores únicos. De forma predeterminada, se tienen en cuenta todos los valores (para esto, puede especificar específicamente no DISTINCT, sino TODOS, pero no se requiere la palabra TODOS).

Ejemplo 1. Existe una base de datos de la empresa con datos sobre sus divisiones y empleados. La tabla Personal también tiene una columna con datos sobre los salarios de los empleados. La selección de la tabla se ve así (para ampliar la imagen, haga clic en ella con el botón izquierdo del mouse):

Para obtener la suma de todos los salarios, utilice la siguiente consulta:

SELECCIONE SUMA (Salario) DEL Personal

Esta consulta devolverá el valor 287664,63.

Y ahora . En los ejercicios ya empezamos a complicar las tareas, acercándolas a las encontradas en la práctica.

Función mínima de SQL

La función SQL MIN también opera en columnas cuyos valores son números y devuelve el mínimo de todos los valores de la columna. Esta función tiene una sintaxis similar a la de la función SUMA.

Ejemplo 3. La base de datos y la tabla son las mismas que en el ejemplo 1.

Necesitamos averiguar el salario mínimo de los empleados del departamento número 42. Para ello, escriba la siguiente solicitud:

La consulta devolverá el valor 10505,90.

Y otra vez ejercicio para la auto-solución. En este y algunos otros ejercicios, necesitará no solo la tabla Staff, sino también la tabla Org, que contiene datos sobre las divisiones de la empresa:


Ejemplo 4. La tabla Org se agrega a la tabla Staff y contiene datos sobre los departamentos de la empresa. Imprima el número mínimo de años trabajados por un empleado en un departamento ubicado en Boston.

Función SQL MAX

La función SQL MAX funciona de manera similar y tiene una sintaxis similar, que se usa cuando necesita determinar el valor máximo entre todos los valores de una columna.

Ejemplo 5.

Necesita averiguar el salario máximo de los empleados del departamento número 42. Para ello, escriba la siguiente solicitud:

La consulta devolverá el valor 18352,80.

Es la hora ejercicios para solución independiente.

Ejemplo 6. Volvemos a trabajar con dos tablas: Staff y Org. Muestra el nombre del departamento y el valor máximo de la comisión que recibe un empleado del departamento perteneciente al grupo de departamentos (División) Este. Usar JOIN (unir mesas) .

Función SQL AVG

Lo que se afirma con respecto a la sintaxis de las funciones anteriores descritas también es válido para la función SQL AVG. Esta función devuelve el promedio de todos los valores de una columna.

Ejemplo 7. La base de datos y la tabla son las mismas que en los ejemplos anteriores.

Supongamos que desea conocer la antigüedad promedio de los empleados del departamento número 42. Para ello, escriba la siguiente consulta:

El resultado será 6,33.

Ejemplo 8. Trabajamos con una mesa: el personal. Muestra el salario promedio de los empleados con 4 a 6 años de experiencia.

Función CUENTA SQL

La función SQL COUNT devuelve el número de registros en una tabla de base de datos. Si especifica SELECT COUNT(COLUMN_NAME) ... en la consulta, el resultado será el número de registros sin tener en cuenta aquellos registros en los que el valor de la columna sea NULL (indefinido). Si utiliza un asterisco como argumento e inicia una consulta SELECT COUNT(*) ..., el resultado será el número de todos los registros (filas) de la tabla.

Ejemplo 9. La base de datos y la tabla son las mismas que en los ejemplos anteriores.

Quiere saber el número de todos los empleados que reciben comisiones. La siguiente consulta devolverá el número de empleados cuyos valores de la columna Comm no son NULL:

SELECCIONAR RECUENTO (Comunicación) DEL Personal

El resultado será 11.

Ejemplo 10. La base de datos y la tabla son las mismas que en los ejemplos anteriores.

Si desea averiguar el número total de registros en la tabla, utilice una consulta con un asterisco como argumento para la función CONTAR:

SELECCIONAR RECUENTO (*) DEL Personal

El resultado será 17.

En el proximo ejercicio para la solución independiente necesitarás utilizar una subconsulta.

Ejemplo 11. Trabajamos con una mesa: el personal. Muestra el número de empleados en el departamento de planificación (Plains).

Funciones agregadas con SQL GROUP BY

Ahora veamos el uso de funciones agregadas junto con la declaración SQL GROUP BY. La instrucción SQL GROUP BY se utiliza para agrupar valores de resultados por columnas en una tabla de base de datos. El sitio web tiene una lección dedicada por separado a este operador .

Ejemplo 12. Existe una base de datos del portal de publicidad. Tiene una tabla de anuncios que contiene datos sobre los anuncios enviados durante la semana. La columna Categoría contiene datos sobre categorías de anuncios grandes (por ejemplo, Bienes raíces) y la columna Partes contiene datos sobre partes más pequeñas incluidas en las categorías (por ejemplo, las partes Apartamentos y Casas de verano son partes de la categoría Bienes raíces). La columna Unidades contiene datos sobre la cantidad de anuncios enviados y la columna Dinero contiene datos sobre la cantidad de dinero recibida por enviar anuncios.

CategoríaParteUnidadesDinero
TransporteCarros110 17600
Bienes raícesApartamentos89 18690
Bienes raícesdacha57 11970
Transportemotocicletas131 20960
Materiales de construccióntableros68 7140
Ingenieria EléctricaTelevisores127 8255
Ingenieria EléctricaRefrigeradores137 8905
Materiales de construcciónRegímenes112 11760
OcioLibros96 6240
Bienes raícesEn casa47 9870
OcioMúsica117 7605
OcioJuegos41 2665

Utilizando la instrucción SQL GROUP BY, encuentre la cantidad de dinero ganada al publicar anuncios en cada categoría. Escribimos la siguiente solicitud:

SELECCIONE Categoría, SUMA (Dinero) COMO Dinero DEL GRUPO DE Anuncios POR Categoría

Ejemplo 13. La base de datos y la tabla son las mismas que en el ejemplo anterior.

Usando la instrucción SQL GROUP BY, descubra qué parte de cada categoría tenía la mayor cantidad de listados. Escribimos la siguiente solicitud:

SELECCIONE Categoría, Parte, MÁXIMO (Unidades) COMO Máximo DESDE Anuncios GRUPO POR Categoría

El resultado será la siguiente tabla:

Los valores totales e individuales se pueden obtener en una tabla. combinar resultados de consultas utilizando el operador UNION .

Bases de datos relacionales y lenguaje SQL

Describe el uso de operadores aritméticos y la construcción de columnas calculadas. Se consideran las funciones finales (agregadas) COUNT, SUM, AVG, MAX, MIN. Proporciona un ejemplo del uso del operador GROUP BY para agrupar consultas de selección de datos. Describe el uso de la cláusula HAVING.

Construyendo campos calculados

En general, para crear campo calculado (derivado) la lista SELECT debe contener alguna expresión SQL. Estas expresiones utilizan las operaciones aritméticas de suma, resta, multiplicación y división, así como funciones SQL integradas. Puede especificar el nombre de cualquier columna (campo) de una tabla o consulta, pero solo use el nombre de la columna de la tabla o consulta que aparece en la lista de cláusulas FROM de la declaración correspondiente. Al construir expresiones complejas, es posible que se necesiten paréntesis.

Los estándares SQL le permiten especificar explícitamente los nombres de las columnas de la tabla resultante, para las cuales se utiliza la cláusula AS.

SELECCIONE Producto.Nombre, Producto.Precio, Oferta.Cantidad, Producto.Precio*Oferta.Cantidad COMO Costo DEL Producto INNER JOIN Oferta EN Producto.ProductCode=Oferta.ProductCode Ejemplo 6.1. Cálculo del coste total de cada transacción.

Ejemplo 6.2. Obtenga un listado de empresas indicando los apellidos e iniciales de los clientes.

SELECCIONE Empresa, Apellido+""+ Izquierda(Nombre,1)+"."+Izquierda(Segundo Nombre,1)+"."COMO Nombre Completo DEL Cliente Ejemplo 6.2. Obtención de un listado de empresas indicando los apellidos e iniciales de los clientes.

La solicitud utiliza la función Izquierda incorporada, que en este caso le permite cortar un carácter desde la izquierda en una variable de texto.

Ejemplo 6.3. Obtenga una lista de productos indicando el año y mes de venta.

SELECCIONE Producto.Nombre, Año(Transacción.Fecha) COMO Año, Mes(Transacción.Fecha) COMO Mes DEL Producto INNER JOIN Transacción EN Producto.ProductCode=Transacción.ProductCode Ejemplo 6.3. Recibir un listado de productos indicando el año y mes de venta.

La consulta utiliza las funciones integradas Año y Mes para extraer el año y el mes de una fecha.

Usar funciones de resumen

Mediante el uso funciones finales (agregadas) dentro de la consulta SQL, puede obtener una cantidad de información estadística general sobre el conjunto de valores seleccionados del conjunto de salida.

El usuario tiene acceso a los siguientes conocimientos básicos funciones de resumen:

  • Recuento (Expresión): determina el número de registros en el conjunto de resultados de la consulta SQL;
  • Min/Max (Expresión): determina el más pequeño y el más grande del conjunto de valores en un determinado campo de solicitud;
  • Promedio (Expresión): esta función le permite calcular el promedio de un conjunto de valores almacenados en un campo específico de registros seleccionados por una consulta. Es una media aritmética, es decir la suma de valores dividida por su número.
  • Suma (Expresión): Calcula la suma del conjunto de valores contenidos en un campo específico de los registros seleccionados por la consulta.

La mayoría de las veces, los nombres de las columnas se utilizan como expresiones. La expresión también se puede calcular utilizando los valores de varias tablas.

Todas estas funciones operan con valores en una sola columna de una tabla o en una expresión aritmética y devuelven un solo valor. Las funciones COUNT, MIN y MAX se aplican a campos numéricos y no numéricos, mientras que las funciones SUM y AVG solo se pueden usar para campos numéricos, con la excepción de COUNT(*). Al calcular los resultados de cualquier función, primero se eliminan todos los valores nulos y luego la operación requerida se aplica solo a los valores de columna específicos restantes. La opción COUNT(*) es un caso de uso especial de la función COUNT; su propósito es contar todas las filas de la tabla resultante, independientemente de si contiene valores nulos, duplicados o cualquier otro valor.

Si necesita eliminar valores duplicados antes de usar una función genérica, debe preceder el nombre de la columna en la definición de la función con la palabra clave DISTINCT. No tiene significado para las funciones MIN y MAX, pero su uso puede afectar los resultados de las funciones SUMA y AVG, por lo que debes considerar si debería estar presente en cada caso. Además, la palabra clave DISTINCT solo se puede especificar una vez en cualquier consulta.

Es muy importante señalar que funciones de resumen solo se puede utilizar en una lista en una cláusula SELECT y como parte de una cláusula HAVING. En todos los demás casos esto es inaceptable. Si la lista en la cláusula SELECT contiene funciones de resumen y el texto de la consulta no contiene una cláusula GROUP BY, que permite combinar datos en grupos, entonces ninguno de los elementos de la lista de la cláusula SELECT puede incluir referencias a campos, excepto en la situación en la que los campos actúan como argumentos. funciones finales.

Ejemplo 6.4. Determine el primer nombre alfabético del producto.

SELECCIONE Min(Producto.Nombre) COMO Min_Name DEL Producto Ejemplo 6.4. Determinación del primer nombre alfabético del producto.

Ejemplo 6.5. Determinar el número de transacciones.

SELECCIONE Recuento(*) COMO Número_de_ofertas DESDE Oferta Ejemplo 6.5. Determinar el número de transacciones.

Ejemplo 6.6. Determine la cantidad total de bienes vendidos.

SELECCIONE Suma (Oferta.Cantidad) COMO Cantidad_Artículo DE Oferta Ejemplo 6.6. Determinación de la cantidad total de bienes vendidos.

Ejemplo 6.7. Determine el precio promedio de los bienes vendidos.

SELECCIONE Promedio(Producto.Precio) COMO Precio_Promedio DEL Producto UNIRSE INTERNO Oferta EN Producto.ProductCode=Deal.ProductCode; Ejemplo 6.7. Determinación del precio medio de los bienes vendidos.

SELECCIONE Suma (Producto.Precio*Transacción.Cantidad) COMO Costo DEL Producto INNER JOIN Transacción EN Producto.ProductCode=Transacción.ProductCode Ejemplo 6.8. Calcular el costo total de los bienes vendidos.

Cláusula GRUPO POR

Las consultas a menudo requieren la generación de subtotales, lo que generalmente se indica con la aparición de la frase "para cada..." en la consulta. Para este propósito se utiliza una cláusula GROUP BY en la declaración SELECT. Una consulta que contiene GROUP BY se denomina consulta de agrupación porque agrupa los datos devueltos por la operación SELECT y luego crea una única fila de resumen para cada grupo individual. El estándar SQL requiere que la cláusula SELECT y la cláusula GROUP BY estén estrechamente relacionadas. Cuando una instrucción SELECT contiene una cláusula GROUP BY, cada elemento de la lista en la cláusula SELECT debe tener un valor único para todo el grupo. Además, la cláusula SELECT sólo puede incluir los siguientes tipos de elementos: nombres de campos, funciones de resumen, constantes y expresiones que incluyen combinaciones de los elementos enumerados anteriormente.

Todos los nombres de campo enumerados en la cláusula SELECT también deben aparecer en la cláusula GROUP BY, a menos que el nombre de la columna se use en función final. La regla inversa no es cierta: la cláusula GROUP BY puede contener nombres de columnas que no están en la lista de la cláusula SELECT.

Si se utiliza una cláusula WHERE junto con GROUP BY, se procesa primero y solo se agrupan aquellas filas que satisfacen la condición de búsqueda.

El estándar SQL especifica que al agrupar, todos los valores faltantes se tratan como iguales. Si dos filas de la tabla en la misma columna de agrupación contienen un valor NULL y valores idénticos en todas las demás columnas de agrupación no nulas, se colocan en el mismo grupo.

Ejemplo 6.9. Calcular el volumen medio de compras realizadas por cada cliente.

SELECCIONE Cliente.Apellido, Promedio(Transacción.Cantidad) COMO Cantidad_Promedio DESDE Cliente INNER JOIN Comercio EN Cliente.ClienteCode=Transacción.ClienteCode GRUPO POR Cliente.Apellido Ejemplo 6.9. Calcular el volumen medio de compras realizadas por cada cliente.

La frase "cada cliente" se refleja en la consulta SQL en forma de oración. GRUPO POR Cliente.Apellido.

Ejemplo 6.10. Determine a cuánto se vendió cada producto.

SELECCIONE Producto.Nombre, Suma(Producto.Precio*Transacción.Cantidad) COMO Costo DEL Producto INNER JOIN Oferta EN Producto.ProductCode=Transacción.ProductCode GRUPO POR Producto.Nombre Ejemplo 6.10. Determinación del precio de venta de cada artículo del producto.

SELECCIONE Client.Company, Count(Transaction.TransactionCode) COMO Number_of_transactions FROM Client INNER JOIN Transaction ON Client.ClientCode=Transaction.ClientCode GRUPO POR Client.Company Ejemplo 6.11. Contando el número de transacciones realizadas por cada empresa.

SELECCIONE Cliente.Empresa, Suma(Transacción.Cantidad) COMO Cantidad_Total, Suma(Producto.Precio*Transacción.Cantidad) COMO Costo DESDE Producto INNER JOIN (Cliente INNER JOIN Transacción ON Cliente.ClienteCode=Transacción.ClienteCode) ON Producto.ProductCode=Transacción .Código de Producto GRUPO POR Cliente.Empresa Ejemplo 6.12. Cálculo de la cantidad total de bienes adquiridos por cada empresa y su coste.

Ejemplo 6.13. Determine el costo total de cada producto para cada mes.

SELECCIONE Producto.Nombre, Mes(Transacción.Fecha) COMO Mes, Suma(Producto.Precio*Transacción.Cantidad) COMO Costo DEL Producto INNER JOIN Transacción EN Producto.ProductCode=Transacción.ProductCode GRUPO POR Producto.Nombre, Mes(Transacción.Fecha ) Ejemplo 6.13. Determinando el costo total de cada producto para cada mes.

Ejemplo 6.14. Determine el costo total de cada producto de primera clase para cada mes.

SELECCIONE Producto.Nombre, Mes(Transacción.Fecha) COMO Mes, Suma(Producto.Precio*Transacción.Cantidad) COMO Costo DEL Producto INNER JOIN Transacción EN Producto.ProductCode=Transacción.ProductCode DONDE Producto.Grade="Primer" GRUPO POR Producto .Nombre, Mes(Transacción.Fecha) Ejemplo 6.14. Determinación del costo total de cada producto de primera para cada mes.

TENER oferta

Usando HAVING, se reflejan todos los bloques de datos previamente agrupados usando GROUP BY que satisfacen las condiciones especificadas en HAVING. Esta es una opción adicional para "filtrar" el conjunto de salida.

Las condiciones en TENER son diferentes de las condiciones en DONDE:

  • HAVING excluye grupos con resultados de valor agregado del conjunto de datos resultante;
  • DONDE excluye del cálculo de valores agregados por agrupación los registros que no cumplen la condición;
  • Las funciones agregadas no se pueden especificar en la condición de búsqueda WHERE.

Ejemplo 6.15. Identificar empresas cuyo número total de transacciones supere las tres.

SELECCIONE Client.Company, Count(Trade.Quantity) COMO Número_de_ofertas FROM Client INNER JOIN Trade ON Client.ClientCode=Transaction.ClientCode GRUPO POR Client.Company TENIENDO Count(Transaction.Quantity)>3 Ejemplo 6.15. Identificación de empresas cuyo número total de transacciones superó las tres.

Ejemplo 6.16. Muestre una lista de productos vendidos por más de 10.000 rublos.

SELECCIONE Producto.Nombre, Suma(Producto.Precio*Oferta.Cantidad) COMO Costo DEL Producto INNER JOIN Oferta EN Producto.ProductCode=Transacción.ProductCode GRUPO POR Producto.Nombre TENER Suma(Producto.Precio*Oferta.Cantidad)>10000 Ejemplo 6.16. Mostrando una lista de productos vendidos por más de 10.000 rublos.

Ejemplo 6.17. Muestra una lista de productos vendidos por más de 10.000 sin especificar el importe.

SELECCIONE Producto.Nombre DEL Producto INNER JOIN Oferta EN Producto.ProductCode=Oferta.ProductCode GRUPO POR Producto.Nombre TENER Suma(Producto.Precio*Transacción.Cantidad)>10000 Ejemplo 6.17. Muestra una lista de productos vendidos por más de 10.000 sin especificar el importe.

A partir de la versión 4.0, MySQL DBMS tiene una capacidad bastante conveniente para contar el número de todos los registros que coinciden con una consulta, cuando el número de registros está limitado por LIMIT. Cuando se trabaja con búsquedas en bases de datos, así como cuando se seleccionan tablas con una gran cantidad de registros, esta funcionalidad es simplemente necesaria.

Sintaxis. En una consulta SELECT, debe especificar la opción SQL_CALC_FOUND_ROWS antes de la lista de columnas. Aquí está el comienzo de la sintaxis SELECT.

SELECCIONAR




seleccionar_expr, … …

Por lo tanto, al ejecutar la consulta SELECT SQL_CALC_FOUND_ROWS, el DBMS contará el número total de filas que coinciden con la condición de la consulta y almacenará este número en la memoria. Naturalmente, la consulta SELECT SQL_CALC_FOUND_ROWS solo tiene sentido cuando se usa un límite (LIMIT). Inmediatamente después de ejecutar la consulta de selección, para obtener el número de registros, es necesario ejecutar otra consulta SELECT: SELECT FOUND_ROWS ();. Como resultado, MySQL devolverá una fila con un campo en el que se almacenará el número de filas.

Un ejemplo de las consultas mismas:

> SELECCIONE SQL_CALC_FOUND_ROWS * DESDE tbl_name DONDE número > 100 LÍMITE 10;
> SELECCIONAR FILAS_ENCONTRADAS();

La primera consulta devolverá (generará) 10 filas de la tabla tbl_name para las cuales el número de condición > 100 es verdadero. La segunda llamada al comando SELECT devolverá el número de filas que el primer comando SELECT habría devuelto si se hubiera escrito sin él. la expresión LÍMITE. Aunque usar SELECT SQL_CALC_FOUND_ROWS requiere que MySQL vuelva a calcular todas las filas en el conjunto de resultados, sigue siendo más rápido que sin LIMIT porque no tiene que enviar el resultado al cliente.

Solicitudes de ejemplo de PHP:

$resultado = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10″, $enlace);
mientras ($fila = mysql_fetch_assoc($resultado))
{
var_dump($fila);
}

$resultado = mysql_query("SELECT FOUND_ROWS()", $enlace);
$num_rows = mysql_result($resultado, 0);
echo "$num_rows Filas\n";

Como resultado de la ejecución del código, siempre que $link apunte a una conexión abierta al DBMS, PHP imprimirá 10 filas de la tabla table1 y luego un valor entero del número de filas que coinciden con la consulta (ignorando LIMIT).

En consultas UNION, SQL_CALC_FOUND_ROWS puede comportarse de dos maneras debido al hecho de que LIMIT puede aparecer en varios lugares. Los recuentos de filas se pueden mantener para consultas SELECT individuales o para toda la consulta después de fusionarlas.

El propósito de SQL_CALC_FOUND_ROWS para UNION es que debería devolver el número de filas que se devolverían sin un LÍMITE global. Las condiciones para usar SQL_CALC_FOUND_ROWS con UNION se enumeran a continuación:

  • La palabra clave SQL_CALC_FOUND_ROWS debe especificarse en la primera instrucción SELECT.
  • El valor de FOUND_ROWS() solo será preciso si se utiliza UNION ALL. Si se especifica UNION sin ALL, se produce la eliminación de duplicados y el valor de FOUND_ROWS() solo será aproximado.
  • Si LIMIT no está presente en UNION, entonces se ignora SQL_CALC_FOUND_ROWS y se devuelve el número de filas en la tabla temporal que se crea para ejecutar UNION.

En este tutorial aprenderás a utilizar función CONTAR en SQL Server (Transact-SQL) con sintaxis y ejemplos.

Descripción

En SQL Server (Transact-SQL) función CONTAR devuelve el número de filas de un campo o expresión en el conjunto de resultados.

Sintaxis

La sintaxis de la función COUNT en SQL Server (Transact-SQL) es:

O la sintaxis de la función CONTAR al agrupar los resultados de una o más columnas es:

Parámetros o argumentos

expresión1, expresión2,… expresión_n
Expresiones que no están incluidas en una función COUNT y deben incluirse en una cláusula GROUP BY al final de la declaración SQL.
agregada_expresión es la columna o expresión cuyos valores no NULL se contarán.
tablas: tablas de las que desea obtener registros. Debe haber al menos una tabla listada en la cláusula FROM.
DONDE condiciones - opcional. Estas son condiciones que deben cumplirse para los registros seleccionados.

Incluyendo valores no NULL

No todo el mundo entiende esto, pero la función COUNT solo contará aquellos registros donde el valor de la expresión en COUNT (aggregate_expression) no sea NULL. Cuando una expresión contiene un valor NULL, no se incluye en el contador COUNT.

Veamos un ejemplo de la función COUNT que demuestra cómo la función COUNT evalúa los valores NULL.

Por ejemplo, si tienes la siguiente tabla llamada mercados:

Este ejemplo de COUNT devolverá 3 porque todos los valores de market_id en el conjunto de resultados de la consulta NO son NULOS.

Sin embargo, si ejecutó la siguiente instrucción SELECT, que utiliza la función COUNT:

Transact-SQL

SELECCIONE COUNT(filiales) DE los mercados; --Resultado: 1

Este ejemplo de COUNT solo devolverá 1, ya que solo un valor filial en el conjunto de resultados de la consulta NO ES NULO. Esta será la primera línea que diga filiales = "sí". Esta es la única fila que se incluye en el cálculo de la función CONTAR.

Solicitud

La función COUNT se puede utilizar en las siguientes versiones de SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005

Ejemplo con un campo

Veamos algunos ejemplos de la función COUNT de SQL Server para comprender cómo usar la función COUNT en SQL Server (Transact-SQL).

Por ejemplo, puedes averiguar cuántos contactos tiene un usuario con apellido = "Rasputin".

En este ejemplo de la función CONTAR, especificamos el alias "Número de contactos" para la expresión CONTAR (*). Por lo tanto, el conjunto de resultados mostrará "Número de contactos" como nombre del campo.

Ejemplo usando DISTINCT

Puede utilizar el operador DISTINTO en la función CONTAR. Por ejemplo, la siguiente declaración SQL devuelve el número de departamentos únicos donde al menos un empleado tiene nombre = 'Samvel'.

Tengo una solicitud como:

SELECCIONE i.*, CONTAR(*) COMO monedas, SUMA(ig.cantidad) COMO total, SUMA(g.precio * ig.cantidad) COMO precio, c.brevemente COMO cname DE factura COMO i, factura_bienes COMO ig, buena g IZQUIERDA UNIR moneda c ON (c.id = g.moneda) DONDE ig.invoice_id = i.id Y g.id = ig.good_id GRUPO POR g.moneda ORDENAR POR i.fecha DESC;

aquellos. se selecciona una lista de pedidos, en la que se calculan los costos totales de los bienes en diferentes monedas (la moneda se establece para el producto, la columna cname en el resultado es el nombre de la moneda)

necesita obtener la cantidad de registros con el mismo i.id en la columna de resultados de monedas; sin embargo, los experimentos con los parámetros COUNT() no llevaron a nada: siempre devuelve 1

Pregunta: ¿Es posible obtener el valor real en la columna de monedas? Aquellos. si los bienes se piden con precios en 3 monedas diferentes, ¿monedas = 3?

Sin embargo, MySQL se toma demasiadas libertades con respecto a SQL. Por ejemplo, ¿qué significa i.* en el contexto de esta selección? ¿Todas las columnas de la tabla de facturas? Dado que no se les aplica ninguna función de grupo, sería bueno si estuvieran listados en GROUP BY; de lo contrario, el principio de agrupar filas no está del todo claro. Si necesita recibir todos los productos para todos los pedidos por moneda, esto es una cosa; si necesita recibir todos los productos agrupados por moneda para cada pedido, esto es completamente diferente.
Según su selección, podemos asumir la siguiente estructura de datos:
Tabla de facturas:

Tabla factura_bienes:

Tabla de mercancías:

Tabla de divisas:

¿Qué devolverá tu selección actual? En teoría, devolverá N filas para cada pedido para cada moneda en la que este pedido contenga bienes. Pero debido al hecho de que en group by no se especifica nada más que g.currency, esto no es obvio :), además, la columna c.brevely también contribuye a la formación implícita de grupos. Lo que tenemos como resultado, para cada combinación única de i.*, g.currency y c.brevemente, se formará un grupo a cuyas líneas se aplicarán las funciones SUMA y CONTAR. El hecho de que como resultado de jugar con el parámetro COUNT siempre obtuviera 1 significa que solo había un registro en el grupo resultante (es decir, los grupos no están formados como usted podría requerir, ¿puede describir los requisitos con más detalle?). En su pregunta no queda claro qué le gustaría saber: ¿cuántas monedas diferentes estaban involucradas en la orden o cuántas órdenes estaban en una moneda determinada? En el primer caso, son posibles varias opciones, todo depende de las capacidades de MySQL; en el segundo, es necesario escribir la expresión de selección de manera diferente;

Sin embargo, MySQL se toma demasiadas libertades con respecto a SQL. Por ejemplo, ¿qué significa i.* en el contexto de esta selección? ¿Todas las columnas de la tabla de facturas?

Sí exactamente. Pero esto no juega un papel importante, porque... En este caso no hay columnas útiles entre ellas. Sea i.* i.id . Ser especifico.

¿Qué devolverá tu selección actual? En teoría, devolverá N filas para cada pedido para cada moneda en la que este pedido contenga bienes. Pero debido al hecho de que group by no especifica nada más que g.currency, esto no es obvio :),

Exactamente.
Devolverá lo siguiente (en este ejemplo, desde i selecciono solo id y no todas las columnas):

identificaciónmonedastotalprecionombre
33 1 1.00 198.00 B.F.
33 1 4.00 1548.04 FROTAR
Además, la columna c.brevely también contribuye a la formación implícita de grupos.

¿Cómo? Las tablas se unen por c.id=g.currency y se agrupan por g.currency.

El hecho de que como resultado de jugar con el parámetro COUNT siempre obtuvieras 1 significa que solo había un registro en el grupo resultante

No, el grupo fue construido a partir de 1er registros. Hasta donde tengo entendido, COUNT() devuelve 1 por este motivo (después de todo, las columnas que son diferentes en el grupo (aunque, excepto la columna de moneda) se crean mediante funciones agregadas).

(es decir, los grupos no se forman como usted podría requerir, ¿puede describir los requisitos con más detalle?).

Se forman grupos según sea necesario. cada grupo -- Este costo total de los bienes en cada moneda. Sin embargo, además de eso, yo hay que calcular cuanto mismo elementos en este grupo.

En su pregunta no queda claro qué le gustaría saber: ¿cuántas monedas diferentes estaban involucradas en la orden o cuántas órdenes estaban en una moneda determinada?

Sí, gané un poco de dinero. Sólo el primero.

dmig[expediente]
Por participación "implícita" en la formación de un grupo, me refiero a que si la columna no está especificada en GROUP BY y al mismo tiempo NO es un argumento para la función de grupo, entonces el resultado de la selección será idéntico a qué sería si esa columna SE especificara en GROUP BY. Su selección y la selección a continuación producirán exactamente el mismo resultado (no preste atención a las uniones, simplemente las llevé a un formato de grabación único):

Seleccione i.id id, contar(*) monedas, suma(ig.cantidad) total, SUMA(g.precio * ig.cantidad) precio, c.brevemente cname DE factura me uno a factura_bienes ig en (ig.invoice_id = i. id) unirse a good g on (g.id = ig.good_id) LEFT OUTER JOIN moneda c ON (c.id = g.currency) agrupar por i.id, c.brevemente

Resulta que en cada fila de la muestra resultante hay una, y sólo una moneda (si fuera diferente, entonces habría dos filas). ¿De qué número de elementos estamos hablando en este caso? ¿Acerca de los artículos del pedido? Entonces su selección es absolutamente correcta, solo para esta moneda, solo hay un artículo en este orden.
Veamos el esquema de datos:

  1. Hay muchos artículos (líneas) en un pedido, ¿verdad?
  2. Cada artículo es un producto en el directorio de productos, ¿verdad?
  3. Cada producto tiene una moneda específica (y solo una), esto se desprende de c.id = g.currency, ¿verdad?

¿Cuántas monedas hay en el pedido? Hay tantos puntos con DIFERENTES monedas.
Agregar g.price * ig.quantity solo tiene sentido para puntos en una moneda;) (aunque también se pueden agregar kilómetros con horas :) Entonces, ¿qué es lo que no te conviene? Usted indica que necesita cuántas monedas diferentes estaban involucradas en el pedido.
y en este caso, hacer esto en el marco de la misma selección sin todo tipo de trucos (que MySQL probablemente no podrá manejar) no funcionará;(
Desafortunadamente, no soy un experto en MySQL. En Oracle puedes hacer esto con una selección, pero ¿te ayudará este consejo? Difícilmente;)

# Hay muchos artículos (líneas) en un pedido, ¿verdad?
# Cada artículo es un producto en el directorio de productos, ¿verdad?
# Cada producto tiene una moneda específica (y solo una), esto se deriva de c.id = g.currency, ¿verdad?

Entonces.
Un pedido: un registro en la tabla de facturas, corresponde a n(>0) registros en factura_bienes, cada uno de los cuales corresponde a 1 registro en la tabla de bienes, el registro “moneda” en cada uno de los cuales, a su vez, corresponde al Primer registro en la tabla de divisas ( LEFT JOIN - en caso de editar el directorio de divisas con las manos torcidas - tablas como MyISAM no admiten claves externas).

¿Cuántas monedas hay en el pedido? Hay tantos puntos con DIFERENTES monedas.

Sí exactamente.

Agregar g.price * ig.quantity tiene sentido solo para puntos en una moneda;) (aunque también se pueden agregar kilómetros con horas :)

Es por eso que la agrupación se realiza por identificación de moneda (g.currency).

En Oracle puedes hacer esto con una selección, pero ¿te ayudará este consejo?

Megabyte.
Hablé un poco con Oracle y estoy familiarizado con pl/sql.

Opción 1.

Seleccione a.*, cuente (*) sobre (partición por a.id) monedas de (seleccione i.id id, suma(ig.quantity) total, SUM(g.price * ig.quantity) precio, c.brevemente cname DESDE la factura me uno a factura_bienes ig en (ig.invoice_id = i.id) me uno a good g en (g.id = ig.good_id) LEFT OUTER JOIN moneda c ON (c.id = g.currency) grupo por i.id, c.brevemente) un

Para ello se utiliza el llamado función analítica. Con un 99% de probabilidad NO funciona en MySQL.

Opcion 2.
Se crea una función, countCurrencies por ejemplo, que en base al id del pedido devuelve el número de monedas que participaron en el mismo y luego:

Seleccione i.id id, countCurrencies(i.id) monedas, suma(ig.quantity) total, SUM(g.price * ig.quantity) precio, c.brevemente cname FROM factura me uno a Bill_goods ig en (ig.invoice_id = i.id) unirse a good g on (g.id = ig.good_id) LEFT OUTER JOIN moneda c ON (c.id = g.currency) agrupar por i.id, c.brevemente, countCurrencies(i.id)

Puede que funcione... pero se llamará para cada moneda de cada pedido. No sé si MySQL te permite hacer GROUP BY por función...

Opción número 3

Seleccione i.id id, monedas agr.cnt, suma (ig.cantidad) total, SUMA (g.precio * ig.cantidad) precio, c.brevemente cname DE la factura me uno a factura_bienes ig en (ig.invoice_id = i.id ) unirse bien continuar (g.id = ig.good_id) UNIRSE EXTERNA IZQUIERDA moneda c ON (c.id = g.currency) unirse externa izquierda (seleccione ii.id, contar (gg.currency distinta) cnt de la factura ii, invoce_goods iig, good gg donde ii.id = iig.invoice_id y gg.id = iig.good_id agrupar por ii.id) agr on (i.id = agr.id) agrupar por i.id, c.brevemente, agr. cnt

Probablemente la opción más correcta... y posiblemente la que más funciona de todas.

La más rápida es la opción número 1. El número 2 es el más ineficaz, porque Cuantas más monedas haya en el pedido, más a menudo se cuentan.
El número 3 tampoco es, en principio, el mejor en términos de velocidad, pero al menos puede confiar en el almacenamiento en caché dentro del DBMS.

El resultado de las tres selecciones será el siguiente:

identificaciónmonedastotalprecionombre
33 2 1.00 198.00 B.F.
33 2 4.00 1548.04 FROTAR

para la misma identificación, el número en la columna de monedas siempre será el mismo, ¿es esto lo que necesitas?