2014-07-17 7 views
0

J'essaie de fusionner quelques tables afin d'obtenir la sortie comme indiqué dans l'image ci-dessous.Tables de fusion SQL

enter image description here

Mon problème est que je ne suis pas sûr de ce type de joint à utiliser pour atteindre cet

quelqu'un peut me aider s'il vous plaît avec la syntaxe.

+0

Vous pourriez avoir besoin d'utiliser un [ 'PIVOT'] (http: // www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query) – valverij

+0

combien de tests vs combien d'utilisateurs, logiquement j'imagine que vous voulez changer les lignes et les colonnes de votre sortie . Que utilisez-vous pour produire ce rapport? –

+0

S'il vous plaît, postez les données pour votre question dans un format utilisable. Idéalement, les instructions 'create table' et' insert' sont prêtes pour F5. Pour l'instant, je vais seulement vous donner un indice: 'PIVOT' et' FULL OUTER JOIN'. –

Répondre

3

Vous pourriez faire quelque chose comme ceci, c'est un pivot dynamique comme vous pourriez ajouter/emporter des utilisateurs?

CREATE TABLE #Tests (
    Test_ID INT, 
    TestName VARCHAR(50)); 
INSERT INTO #Tests VALUES (1, 'SQL Test'); 
INSERT INTO #Tests VALUES (2, 'C# Test'); 
INSERT INTO #Tests VALUES (3, 'Java Test'); 
CREATE TABLE #Users (
    [User_ID] INT, 
    UserName VARCHAR(50)); 
INSERT INTO #Users VALUES (1, 'Joe'); 
INSERT INTO #Users VALUES (2, 'Jack'); 
INSERT INTO #Users VALUES (3, 'Jane'); 
CREATE TABLE #UserTests (
    ID INT, 
    [User_ID] INT, 
    Test_ID INT, 
    Completed INT); 
INSERT INTO #UserTests VALUES (1, 1, 1, 0); 
INSERT INTO #UserTests VALUES (2, 1, 2, 1); 
INSERT INTO #UserTests VALUES (3, 1, 3, 1); 
INSERT INTO #UserTests VALUES (4, 2, 1, 0); 
INSERT INTO #UserTests VALUES (5, 2, 2, 0); 
INSERT INTO #UserTests VALUES (6, 2, 3, 0); 
INSERT INTO #UserTests VALUES (7, 3, 1, 1); 
INSERT INTO #UserTests VALUES (8, 3, 2, 1); 
INSERT INTO #UserTests VALUES (9, 3, 3, 1); 
DECLARE @Cols VARCHAR(MAX); 
SELECT @Cols = STUFF((SELECT distinct ',' + QUOTENAME(u.UserName) 
      FROM #Users u 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 
DECLARE @Query NVARCHAR(MAX); 
SELECT @Query = 'SELECT TestName, ' + @Cols + ' FROM 
(
    SELECT 
     t.TestName, 
     u.UserName, 
     ut.Completed 
FROM 
    #Tests t 
    INNER JOIN #UserTests ut ON ut.Test_ID = t.Test_ID 
    INNER JOIN #Users u ON u.[User_ID] = ut.[User_ID]) x 
    PIVOT (
     MAX(Completed) 
     FOR UserName IN (' + @Cols + ') 
    ) AS pt'; 
EXEC(@Query); 

Les résultats sont:

TestName Jack Jane Joe 
C# Test  0  1  1 
Java Test 0  1  1 
SQL Test 0  1  0 

(Mêmes résultats que la vôtre, mais dans un ordre de tri.)

+0

Oui, des utilisateurs peuvent être ajoutés/supprimés. Je vais essayer ce qui précède. Merci –