2016-10-11 7 views
0

Ich habe 2 Tabellen, die ich kombiniere und das funktioniert, aber ich denke, dass ich die zweite Tabelle falsch entworfen habe, da ich für jedes Element eine Spalte habe, was wirklich eine Multiple-Choice-Frage ist. Die Abfrage ist dies:Konvertieren von Spaltenüberschriften in Zeilenelemente

select Count(n.ID) as MemCount, u.Pay1Click, u.PayMailCC, u.PayMailCheck, u.PayPhoneACH, u.PayPhoneCC, u.PayWuFoo 
from name as n inner join 
UD_Demo_ORG as u on n.ID = u.ID 
where n.MEMBER_TYPE like 'ORG_%' and n.CATEGORY not like '%_2' and 
(u.Pay1Click = '1' or u.PayMailCC = '1' or u.PayMailCheck = '1' or u.PayPhoneACH = '1' or u.PayPhoneCC = '1' or u.PayWuFoo = '1') 
group by u.Pay1Click, u.PayMailCC, u.PayMailCheck, u.PayPhoneACH, u.PayPhoneCC, u.PayWuFoo 

Die Ergebnisse kommen wie folgt aus:

Count Pay1Click PayMailCC PayMailCheck PayPhoneACH PayPhoneCC PayWuFoo 
8  0   0   0    0    0   1 
25  0   0   0    0    1   0 
8  0   0   0    1    0   0 
99  0   0   1    0    0   0 
11  0   1   0    0    0   0 

Die Frage ist also, wie kann ich dies auf 2 Spalten bekommen, Graf und dann die Header der nächsten 6 Header so sehen die Ergebnisse wie folgt aus:

Count PaymentType 
8  PayWuFoo   
25  PayPhoneCC   
8  PayPhoneACH   
99  PayMailCheck   
11  PayMailCC   

Dank.

+1

Welches 'DBMS' verwenden Sie. Müde, diese Aussage zu schreiben:/ –

+0

Entschuldigung, meine Schuld daran. SQL Server 2012 – Jayson

Antwort

0

Versuchen Sie dieses

Select Count, 

CASE WHEN Pay1Click=1 THEN 'Pay1Click' 
      PayMailCC=1 THEN ' PayMailCC' 
      PayMailCheck=1 THEN 'PayMailCheck' 
      PayPhoneACH=1 THEN 'PayPhoneACH' 
      PayPhoneCC=1 THEN 'PayPhoneCC' 
      PayWuFoo=1 THEN 'PayWuFoo' 
    END as PaymentType 

FROM ...... 
+0

Das hat funktioniert. Ich habe komplett vergessen, eine Case-Anweisung zu machen. Vielen Dank. – Jayson

0

Ich denke, Sie haben tatsächlich einen Fehler in der Struktur der zweiten Tabelle gemacht. Anstatt eine Zeile für jede Multiple-Choice-Frage zu erstellen, würde ich vorschlagen, alle diese Spalten in eine "Antwort" -Spalte umzuwandeln, so dass Sie den tatsächlichen Namen der Alternative als Datensatz in dieser Spalte hätten.

Dazu müssen Sie jedoch die Struktur Ihrer Tabellen ändern und die Art ändern, in der die Tabelle ausgefüllt wird. Sie sollten den Namen der geprüften Alternative überprüfen und in Ihre Tabelle einfügen.

Mehr dazu, Sie könnten für sich wiederholende Daten in Ihrer Tabelle sorgen, so dass immer wieder die gleiche Zeichenkette Ihre Tabelle größer wachsen lassen könnte. wenn es andere Dinge impliziert die Antwort, andere Informationen in der UD_Demo_ORG Tabelle, dann können Sie die Tabelle normalisieren, eine payment_dimension Tisch oder so etwas wie dies zu schaffen, geben Sie Ihre Alternativen eine ID wie

ID PaymentType OtherInfo(description, etc)... 
1  PayWuFoo   ... 
2  PayPhoneCC  ... 
3  PayPhoneACH  ... 
4  PayMailCheck  ... 
5  PayMailCC  ... 

Dies ist eine Dimensionstabelle genannt, und in Ihren Datensätzen würden Sie die ID des Zahlungstyps haben und nicht die Informationen, die Sie nicht benötigen. nur

Count PaymentId 
8  1   
25  2   
8  3   
99  4   
11  5 

als Ergebnismenge Statt eines großen Ergebnismenge, vielleicht könnten Sie viel Ihrer Anfrage und haben zu vereinfachen. Es würde auch die Abfrage schneller machen, und wenn Sie andere Informationen benötigen, können Sie dann der Tabelle beitreten und sie erhalten.

ABER wenn das einzige Feld, das Sie haben würden, ist der Name, vielleicht könnten Sie den paymentType als die "id" in diesem Fall verwenden ... nur darüber nachdenken. Es ist skalierbar, wenn Sie es in eine Dimensionstabelle aufteilen.

Einige Literaturhinweise:

  1. http://beginnersbook.com/2015/05/normalization-in-dbms/ "Normalisierungs in DBMS"

  2. http://searchdatamanagement.techtarget.com/answer/What-are-the-differences-between-fact-tables-and-dimension-tables-in-star-schemas "Unterschiede zwischen den Faktentabellen und Dimensionen Tabellen"

Verwandte Themen