2016-06-03 7 views
1

Ich habe eine Datentabelle mit etwa 30 Spalten 1 Spalte ist eine Benutzer-ID und der Rest von ihnen sind "Elemente" mit den Werten der Rangfolge von 0 - 29, die angibt die Höhe des Interesses an dem Artikel. 0 = Kein Interesse 1 = Most und 29 = Least.Können Sie SELECT * verwenden und Bedingung für alle Spalten setzen

Gibt es weg alle Spalten mit einer Zählung zur Ausgabe ohne eine Erklärung oder für jedes Element zu schreiben, mit dem „*“ wie

SELECT COUNT(*) 
FROM Table t 
WHERE * != 0 

Der Ausgang wäre

Nutzung
Item1 | Item2 | Item3 | Item4 | Item5 
xxxxx | xxxxx | xxxxx | xxxxx | xxxxx 

xxxxx die Gesamtanzahl der Datensätze in der Spalte, in der der Wert nicht 0 ist?

+6

Die Antwort ist nein. – jarlh

+7

Die Lösung besteht darin, Ihre Datenbank neu zu gestalten. Sich wiederholende Spalten zu haben ist im Allgemeinen eine schlechte Idee, gerade weil Sie häufig einige oder alle abfragen wollen. Deaktivieren Sie stattdessen die Daten und speichern Sie für jedes Element eine * Zeile * (Benutzer-ID, Element-Nr., Rang). Sobald Sie ein anständiges Datenmodell eingeführt haben, wird die Abfrage der Daten unkompliziert. –

+0

Welche Art von SQL verwenden Sie? Es kann einige spezifische Schikanen geben, die dir helfen könnten. – Tony

Antwort

0

Sie könnten durch die INFORMATION_SCHEMA gehen und eine Abfrage erstellen und es mit der SQL-Funktion EXEC() ausführen.

Verbinden Sie INFORMATION_SCHEMA.TABLES mit INFROMATION_SCHEMA.COLUMNS. Auch umhüllen Sie möchten Sie es wiederverwenden Platzieren Sie eine Variable mit dem gewünschten Tabellennamen. Sie müssen INFORMATION_SCHEMA.COLUMNS durch die Art Spalte filtern, die Sie benötigen (int)

0

Es ist ein XML-Trick, um dynamisch Daten ohne explizite Spalten Aufzählung zu normalisieren:

With SampleTab (UserId, Item1, Item2) As (
     Select 'A' , 0 , 1  Union All 
     Select 'B' , 2 , 0  Union All 
     Select 'C' , 3 , 0 
), SampleXML As (
    Select CAST((Select * From SampleTab root For XML Auto) AS XML) As Doc 
), SampleNormalised As (
    Select 
     NodeName = C.value('local-name(.)', 'varchar(50)'), 
     NodeValue = C.value('(.)[1]', 'int') 
    From SampleXML 
    Cross Apply Doc.nodes('/root/@*') AS T(C) 
) 
    Select NodeName As Item, Count(*) As CountNot0 
    From SampleNormalised 
    Where NodeName <> 'UserId' AND NodeValue <> 0 
    Group By NodeName; 

Ergebnis:

Item CountNot0 
----- --------- 
Item1   2 
Item2   1 

Nicht sicher, dass wird Ihnen helfen, aber es gibt in SQL keine Möglichkeit, eine Spalte (User Id) in der Ergebnismenge zu überspringen, ohne alle anderen Spalten abgesehen von Dynamic SQL, das von Monofuse sowieso erwähnt wird.

Verwandte Themen