2017-07-15 1 views
1

J'ai une situation où j'ai besoin d'obtenir les enregistrements de plusieurs tables qui contient le nom de colonne 'YrId' et je veux récupérer seulement des valeurs distinctes de cette table aussi bien que je veux obtenir le compte des valeurs groupées par 'YrId'. Pour obtenir la colonne qui contient plus de 0 valeurs que j'ai la requête suivante qui me renvoie le nom de la table ayant désiré colonneComment obtenir des valeurs distinctes de plusieurs tables avec le nombre dans SQL Server?

SELECT 
    t.name AS [Table Name], 
    'Total Record Count'=max(i.rows) 
FROM 
    sys.tables AS t 
INNER JOIN 
    sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 
INNER JOIN 
    sysindexes i ON t.object_id=i.id 
WHERE 
    c.name LIKE '%yrid%' 
GROUP BY 
    t.name 
HAVING 
    MAX(i.rows) > 0 
ORDER BY 
    [total record count] DESC 

De cette requête, je reçois le nom de table qui a la colonne 'yrid' maintenant pour obtenir des valeurs distinctes je lance le requête suivante sur le nom de la table qui est retournée par une requête donnée ci-dessus.

select distinct yrid, 'Table1' 
from Table1 

Mais j'ai un problème avec la requête ci-dessus qui génère une sortie dans plusieurs ensembles de lignes que je ne veux pas. Je veux générer une sortie dans la même rowset qui devrait être comme donné ci-dessous:

Table Name YrId1Count YrId2Count 
---------------------------------- 
Table1  250   350 
Table2  320   410 

Pour autant que je sais que cela peut être réalisé par PIVOT mais je n'a pas réussi à le faire.

+0

Je ne pense pas que votre question soit clairement compréhensible. Pouvez-vous reformuler la question et ajouter quelques exemples de données sources afin que nous sachions ce que vous essayez de réaliser? Merci. – ViKiNG

+0

Il existe de nombreux exemples de pivots en ligne. Avez-vous essayé? –

Répondre

0

De la question, je suppose que vous avez besoin de numéro de colonne particulière (par exemple, employeeid dans mon exemple). Ci-dessous l'exemple va trouver toute la table qui contient la colonne EmployeeId, Il trouvera le Distinct EmployeeId trouvé dans chaque table et insérer dans @TableCounts. À la fin vous avez @Table Counts avec la table et le nombre unique de employeeIds dans chacun d'eux.

DECLARE @t TABLE (name NVARCHAR(MAx)) 

DECLARE @curCol NVARCHAR(50), @query NVARCHAR(MAX) 

DECLARE @TableCounts TABLE (Name Nvarchar(max), NumberOfEmp INT) 


INSERT INTO @t 
SELECT 

    t.name 

FROM 
    sys.tables AS t 
INNER JOIN 
    sys.columns c ON t.OBJECT_ID = c.OBJECT_ID 

WHERE 
    c.name LIKE '%EmployeeId%' 

    SELECT * FROM @t 



    WHILE((SELECT COUNT(*) FROM @t)>0) 
    BEGIN 
     SELECT Top 1 @curCol = name FROM @t 

     SET @query = 'INSERT INTO @TableCounts SELECT '''[email protected]+''',COUNT(DISTINCT EmployeeID) FROM ' + @curCol 



     EXEC sp_executesql @query; 

     DELETE FROM @t where name = @curCol 
    END 


    SELECT * FROM @TableCounts 

Espoir qui aide !!! :)