J'utilise SQL Server 2008 et j'essaie d'écrire une requête qui divise les colonnes en lignes individuelles. Je tire des données de compte et ai besoin de le transformer en scores individuels.SQL: UN-PIVOT et séparé par score individuel
Exemple:
5 étudiants répondent « toujours » et une réponse « toujours » = 3 points;
4 élèves de répondre « habituellement » et la réponse de « généralement » = 2 points
Au lieu d'avoir un champ nommé « toujours » avec un nombre de 5 et un champ nommé « habituellement » avec un nombre de 4, je le ferais J'aime avoir un champ nommé 'Score' avec 5 lignes de 3 et 4 lignes de 2.
J'ai commencé ma requête en utilisant un UNPIVOT, cependant, il ne divise pas les données comme décrit. J'ai inclus des exemples de données et mes résultats souhaités ci-dessous. Toute aide serait appréciée.
Always = 3 points
Usually = 2 points
Sometimes = 1 points
Never = 0 points
données Exemple:
CREATE TABLE #TEST(QUESTION VARCHAR(15), STUDENT VARCHAR(15), STARTDATE DATE, ALWAYS INT, USUALLY INT, SOMETIMES INT, NEVER INT)
INSERT #TEST(QUESTION, STUDENT, STARTDATE, ALWAYS, USUALLY, SOMETIMES, NEVER)
VALUES
('A','BOB','01/01/2016',2,1,1,2),
('A','BOB','03/01/2016',3,1,1,0),
('A','JIM','01/01/2016',2,1,2,0),
('A','JIM','03/01/2016',4,1,0,0),
('BB','BOB','03/01/2016',2,1,1,2),
('BB','BOB','07/01/2016',3,1,1,0),
('BB','JIM','03/01/2016',2,1,2,0),
('BB','JIM','07/01/2016',4,1,0,0)
Requête:
WITH A AS (
SELECT *
FROM #TEST
--WHERE
-- QUESTION = 'A'
--AND STUDENT IN ('BOB','JIM')
--AND STARTDATE = '2016-01-01'
)
SELECT QUESTION, STUDENT, STARTDATE, SCORE
FROM
( SELECT QUESTION, STUDENT, STARTDATE, ALWAYS, USUALLY, SOMETIMES, NEVER
FROM A
) P
UNPIVOT
(SCORE FOR Z IN (ALWAYS, USUALLY, SOMETIMES, NEVER)
) AS unpvt
Résultats attendus: pour la 1ère 2 rangs
QUESTION|STUDENT|STARTDATE|SCORE|
--------+-------+---------+-----+
A |BOB |1/1/2016 |3 |--ALWAYS
A |BOB |1/1/2016 |3 |--ALWAYS
A |BOB |1/1/2016 |2 |--USUALLY
A |BOB |1/1/2016 |1 |--SOMETIMES
A |BOB |1/1/2016 |0 |--NEVER
A |BOB |1/1/2016 |0 |--NEVER
A |BOB |3/1/2016 |3 |--ALWAYS
A |BOB |3/1/2016 |3 |--ALWAYS
A |BOB |3/1/2016 |3 |--ALWAYS
A |BOB |3/1/2016 |2 |--USUALLY
A |BOB |3/1/2016 |1 |--SOMETIMES
Merci pour l'aide, votre suggestion fonctionne pour mon ensemble d'échantillons de données. Pouvez-vous expliquer cela "JOIN (SELECT TOP 100 N = ROW_NUMBER() OVER (ORDER BY Nombre) FROM master..spt_values)"? Je n'ai jamais vu cette table utilisée et je ne comprends pas pourquoi vous l'avez utilisé ou sélectionné le top 100. – JBritton
@JBritton Juste en créant un tableau ad-hoc de 100 enregistrements. Cela permettra "l'expansion" de votre jeu d'enregistrements. –
@JBritton Le Top 100 était une valeur arbitraire. Si vous ne verrez jamais plus de 10 réponses, alors faites-en Top 10. Cela ne fait pas de mal d'avoir une valeur plus grande. La sous-requête est résolue une fois –