2016-11-23 3 views
0

Ich arbeite an einigen Umfragedaten und frage mich, ob ich die Daten neu anordnen könnte, um sie viel brauchbarer zu machen. Die Ergebnisse werden als 1-5 klassifiziert und ich möchte, dass die bevorzugte Tabelle die Ergebnisse nach Wert und Gruppe nach Frage zählt.Rearrange-Datensatz

Original-Tabelle:

year | month | customer_id | survey | q1 | q2 | q3 | q4 | q5 | q6 ----> q29 
-----|-------|-------------|--------|----|----|----|----|----|--- 
2016 | Oct | ABC12345678 | 1  | 1 | 2 | 3 | 1 | 2 | 3 
2016 | Oct | DEF12345678 | 1  | 2 | 1 | 4 | 2 | 1 | 1 
2016 | Oct | GHI12345678 | 1  | 4 | 2 | 1 | 1 | 3 | 2 
2016 | Oct | JKL12345678 | 1  | 2 | 3 | 2 | 4 | 1 | 3 
2016 | Oct | MNO12345678 | 1  | 5 | 2 | 3 | 1 | 2 | 3 
2016 | Oct | PQR12345678 | 1  | 3 | 4 | 4 | 2 | 4 | 4 
2016 | Oct | STU12345678 | 1  | 1 | 5 | 3 | 1 | 2 | 5 
2016 | Oct | VWX12345678 | 1  | 2 | 2 | 4 | 2 | 1 | 1 

Bevorzugte Tabelle:

Year | Month | Survey | Question | 1 | 2 | 3 | 4 | 5 | 
-----|-------|--------|----------|----|----|----|----|----| 
2016 | Oct | 1 | q1  | 80 | 45 | 25 | 63 | 89 | 
2016 | Oct | 1 | q2  | 65 | 75 | 35 | 53 | 69 | 

Ich kann dies tun mit einer grundlegenden Auswahlabfrage, aber es für jede Frage zu tun, wird sich mit 29 Gewerkschaften beenden und es muss sein ein schneller Weg.

Grüße,

Neil

+1

Tag Ihre Frage mit der Datenbank Sie verwenden. Diese Art der Umstrukturierung erfordert jedoch normalerweise eine komplexe Abfrage. –

+0

dachte so viel Gordon, vergiss dann :) –

+0

Dies kann viel einfacher als 29 Gewerkschaften getan werden. Sie müssen dies zuerst aufheben und dann bedingte Aggregation durchführen. für uns, um wirklich zu helfen, wäre es toll, wenn Sie ddl und Beispieldaten posten könnten. –

Antwort

2

Dies ist, was ich bis jemand postet eine bessere Lösung verwenden würde:

<!-- language: lang-sql --> 

use tempdb; 
create table #tempsurvey (year int, month varchar(32), customer_id varchar(32), survey int, [q1] int, [q2] int, [q3] int, [q4] int, [q5] int, [q6] int, [q7] int, [q8] int, [q9] int, [q10] int, [q11] int, [q12] int, [q13] int, [q14] int, [q15] int, [q16] int, [q17] int, [q18] int, [q19] int, [q20] int, [q21] int, [q22] int, [q23] int, [q24] int, [q25] int, [q26] int, [q27] int, [q28] int, [q29] int); 
insert into #tempsurvey values (2016,'Oct', 'ABC12345678', 1, 1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2); 
insert into #tempsurvey values (2016,'Oct', 'DEF12345678', 1, 4,5,1,4,5,1,4,5,1,4,5,1,4,5,1,4,5,1,4,5,1,4,5,1,4,5,1,4,5); 

with cte as (
    select t.[year], t.[month], t.customer_id, t.survey, x.question, x.answer 
    from #tempsurvey t 
     cross apply (values ('q1',q1) ,('q2',q2) ,('q3',q3) ,('q4',q4) ,('q5',q5) ,('q6',q6) ,('q7',q7) ,('q8',q8) ,('q9',q9) ,('q10',q10) ,('q11',q11) ,('q12',q12) ,('q13',q13) ,('q14',q14) ,('q15',q15) ,('q16',q16) ,('q17',q17) ,('q18',q18) ,('q19',q19) ,('q20',q20) ,('q21',q21) ,('q22',q22) ,('q23',q23) ,('q24',q24) ,('q25',q25) ,('q26',q26) ,('q27',q27) ,('q28',q28) ,('q29',q29)) 
     as x (Question,Answer) 
) 
    select [year], [month], [survey], question, [1]=sum(case when answer=1 then 1 else 0 end), [2]=sum(case when answer=2 then 1 else 0 end), [3]=sum(case when answer=3 then 1 else 0 end), [4]=sum(case when answer=4 then 1 else 0 end), [5]=sum(case when answer=5 then 1 else 0 end) 
    from cte 
     group by [year], [month], [survey], question; 

    drop table #tempsurvey; 

Brad Schulz auf Kreuz gelten: http://bradsruminations.blogspot.com/search/label/CROSS%20APPLY

+0

das ist schöne Arbeit SqlZim und perfekt! –

+0

Danke! Wenn Sie die Tabelle wie von Joe Enos vorgeschlagen reorganisieren möchten, können Sie den inneren Teil der Cte verwenden, um das zu generieren. Wenn Ihre Antworten nullwertfähig sind und Sie damit umgehen möchten, wechseln Sie zu extern apply. – SqlZim

+0

hört sich gut an, jetzt benutze ich die Frage- und Umfrage-Spalte. Jetzt kann ich die Fragetitel zurückziehen! Du bist der beste SqlZim! –

1

Sean korrekt ist. Es wird so gehen:

with subquery as (
    select year, month, survey, question, tempVal from #table 
    unpivot 
    (tempVal for question in (q1, q2, q3, q4, q5, q6, q7, ..., q29)) as up 
) 
select year, month, survey, question, 
    sum(case when tempVal = 1 then 1 else 0 end) as a1, 
    sum(case when tempVal = 2 then 1 else 0 end) as a2, 
    sum(case when tempVal = 3 then 1 else 0 end) as a3, 
    sum(case when tempVal = 4 then 1 else 0 end) as a4, 
    sum(case when tempVal = 5 then 1 else 0 end) as a5 
from subquery 
group by year, month, survey, question 
+0

Dank Nimdil, ich war auf halbem Weg dies zu schreiben, wenn SqlZim das Kreuz statt anwenden. Auch richtig, vielen Dank –

+0

http://rextester.com/XXS27650 – McNets