from qgis.core import *
import qgis.utils
layer=qgis.utils.iface.activeLayer()
fields=[] # List of fields
Lquery=[] # List of queries to join together with Union All statement
Cquery=[] # Combined Query to use
for field in layer.fields():
#    ATTENTION à changer le nom de l'identifiant pour éviter liste trop longue
    if field.name() not in ('ID'):
        fields.append(field.name())
        query = " Select '{0}' as 'Champs', {0} as 'Valeur', count(*) as 'Unique' from {1} group by {0} HAVING count(*)!=1".format(field.name(), layer.name())
        Lquery.append(query)
    else:
        print (field.name()) 
for L in Lquery:
    Cquery.append(L+' Union All ')
query=''.join(map(str, Cquery))
query=query[:-11]+' Order by Champs'
vlayer = QgsVectorLayer( "?query={}".format(query), 'counts_'+layer.name(), "virtual" )
QgsProject.instance().addMapLayer(vlayer)