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 p>
(
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.