not nonaggregated groupby column any_value and sql mysql ms-access

sql - nonaggregated - groupby laravel



¿Hay una función group_concat en ms-access? (4)

Debería preguntarse si necesita una solución genérica ( otra es de Allen Browne ) o si la necesita solo para el presente propósito. Si realmente solo lo necesita una vez, hágalo de la manera más fácil.

En una nota al margen, al concatenar listas en código VBA, aprovecha un truco que me enseñó el gurú de acceso Trevor Best, y es para poner el delimitador al comienzo de cada valor y luego usar Mid () para quitarlo apagado. En lugar de esto dentro de su ciclo a través de los registros secundarios:

If Len(strOutput) = 0 Then strOutput = NewValue Else strOutput = strOutput & ", " & NewValue End If

... usa esto dentro del ciclo:

strOutput = strOutput & ", " & NewValue

... y luego, cuando salga del ciclo, quite el delimitador principal:

strOutput = Mid(strOutput, 3)

Esto tiene implicaciones en todo el lugar y simplifica el código para la concatenación en una gran cantidad de contextos.

¿Hay una función group_concat en ms-access o algo similar?




No. Access no tiene una función GROUP_CONCAT. Sin embargo, es posible crear una función VBA que le permita pasar una cadena que contenga una declaración SQL y obtener la funcionalidad equivalente (no es que lo recomiende, pero sí es posible).

Tomando mi propia máquina personal de retorno, aquí hay un código que escribí cuando los dinosaurios gobernaban la Tierra:

Public Function ListQuery(SQL As String _ , Optional ColumnDelimiter As String = " " _ , Optional RowDelimter As String = vbCrLf) As String ''PURPOSE: to return a combined string from the passed query ''ARGS: '' 1. SQL is a valid Select statement '' 2. ColumnDelimiter is the character(s) that separate each column '' 3. RowDelimiter is the character(s) that separate each row ''RETURN VAL: ''DESIGN NOTES: Const PROCNAME = "ListQuery" Const MAXROWS = 100 Const MAXCOLS = 10 Dim oConn As ADODB.Connection Dim oRS As ADODB.Recordset Dim oField As ADODB.Field Dim sRow As cString Dim sResult As cString On Error GoTo ProcErr Set sResult = New cString Set sRow = New cString Set oConn = GetADOConn() sResult.Clear Do Until oRS.EOF sRow.Clear For Each oField In oRS.Fields With sRow If .Length > 0 Then .Append ColumnDelimiter End If .Append Nz(oField.Value) End With Next oField sRow.Trim If sRow.Length > 0 Then With sResult .Append sRow .Append RowDelimter End With End If oRS.MoveNext Loop oRS.Close oConn.Close With sResult If .Right(Len(RowDelimter)).Value = RowDelimter Then .Length = .Length - Len(RowDelimter) End If End With FunctionResult: ListQuery = sResult.Value CleanUp: Set sResult = Nothing Set sRow = Nothing Set oField = Nothing Set oRS = Nothing Set oConn = Nothing Exit Function ProcErr: '' logging code... Resume CleanUp End Function

La función GetADOConn es una función centralizada para recuperar la conexión de la base de datos actual. cString es una clase que imita el comportamiento de la clase StringBuilder de .NET, pero fue escrita mucho antes de que .NET fuera algo más que un TLD y una exageración publicitaria. Como esto se llama en cada fila, la concatenación de cadenas incorporada de VBA será lenta y, por lo tanto, se necesita algo así como una clase StringBuilder . El código original (que he modificado parcialmente) tenía un límite en el número de filas y columnas que podrían usarse, de lo que se tratan las constantes.