Red de conocimiento informático - Problemas con los teléfonos móviles - Informes SQL que muestran cómo se implementan los subtotales y totales agrupados

Informes SQL que muestran cómo se implementan los subtotales y totales agrupados

Los requisitos del cliente incluyen agrupación de columnas, subtotales y totales. Encontré algunas declaraciones sobre sumas totales de SQL en línea. Ninguno de los dos es ideal. Decidí escribirlo yo mismo.

Hay tres ideas:

1. Realizar mucha AGRUPACIÓN y ROLLUP.

Ventajas: El código de implementación es simple y requiere un conocimiento profundo de GROUPPING y ROLLUP.

Desventajas: No se admiten versiones inferiores de Sql Server.

2. Implementación del cursor.

Ventajas: Lógica simple.

Desventajas: Complejo e ineficiente.

3. Utilizar tablas temporales.

Ventajas: Lógica simple y ejecución eficiente. La implementación de SQL es simple.

Desventajas: Una gran cantidad de datos ocupa memoria.

En base a las tres situaciones, se decidió "utilizar una tabla temporal" para implementarlo.

Lograr el efecto

Tabla original TB

Agregar efecto subtotal y total

Declaración SQL

Copiar código El código es el siguiente:

seleccione * en #TB de #TB

seleccione * en #TB1 de #TB donde 1 <>1

seleccione distinto zcxt en # TBype desde #TB ordenar por zcxt

seleccione identidad(int,1,1)?fid,zcxt en #TBype1 desde #TBype

DECLARAR @i int

DECLARAR @k int

seleccionar @i=COUNT(*) de #TBype

establecer @k=0

DECLARAR @ strfname varchar( 50)

MIENTRAS @k <@i

COMIENZAR

Establecer @k = @k + 1

ESTABLECER @strfname= zcxt de # TBype1 donde fid =@k

establecer IDENTITY_INSERT #TB1 ON

insertar en #TB1(fid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz ,ljzj, jz,sybm,zcxt,fa_ljjzzb)

seleccione fid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,zcxt,fa_ljjzzb from

(

seleccione * de #TB donde zcxt=@strfname

unión de todos

seleccione 0 fid,''' qldid ,'' ' fa_cardid,''' ztbz,'' subtotal''' nombre_fa,'' modelo, suma(i_número) como i_número,'' gzrq, suma(CAST(zcyz como dinero)) como zcyz,suma(CAST( ljzj as money )) as ljzj,sum(CAST(jz as money)) as jz,'' sybm,'' zcxt、Sum(fa_ljjzzb) as fa_ljjzzb

de #TB donde zcxt=@strfname

agrupar por ztbz

) como B

desactivar IDENTITY_INSERT #TB1

END

seleccionar qldid,fa_cardid ,zcxt, fa_name, modelo, i_number, gzrq, zcyz, ljzj, jz, sybm, ztbz, fa_ljjzzb de #TB1

unir todos

seleccione '' qldid,'' fa_cardid, '' ztbz ,'' total' fa _name,'' modelo,sum(i_number) as i_number,'' gzrq、sum(CAST(zcyz as money)) as zcyz,sum(CAST(ljzj as money))

as ljzj,sum(CAST(jz as money)) as jz,'' sybm,'' zcxt、Sum(fa_ljjzzb) as fa_ljjzzb

de #TB

Eliminar tabla #TB1

Mesa drop#TBype1

Mesa drop#TBype

Mesa drop#TBype

Mesa drop#TB

Mejoras extendidas

Se puede reescribir como un procedimiento almacenado de subtotal de suma general.