2009-06-29 6 views
1

Mein Chef fragt mich, einen Bericht zu codieren, die die folgenden Komponenten:Fassen Daten durch mehrere Spalten

  • Ein Kreisdiagramm der Mitarbeiterzahl durch staatliche
  • Ein Kreisdiagramm der Mitarbeiterzahl nach Altersklassen (10 Jahre Klammern)
  • Ein Kreisdiagramm der Mitarbeiter des Dienstes (5 Jahre Klammern)
  • Ein Kreisdiagramm von Mitarbeitern Männer/Frauen Bruchs
  • Ein Kreisdiagramm der Mitarbeiteranzahl von Gehalt Band (Computer erzeugt Brack ets).

Es kann andere geben.

Ich weiß, dass ich dies tun kann, indem ich 5 verschiedene SQL-Anweisungen schreibe. Es scheint jedoch, als würde dies 5 Tabellen-Scans für einen Bericht generieren.

Ich könnte schalten Zahnräder und eine Tabelle scannen und analysieren jeden Datensatz auf der Vorderseite und Zähler erhöhen und wahrscheinlich dies mit einem Durchgang zu erreichen.

Wohin soll die kollektive Weisheit bei stackoverflow gehen?

Gibt es eine Möglichkeit, dies mit den Klauseln CUBE oder ROLL UP in T-SQL zu erreichen?

Antwort

2

Wenn Ihre Daten korrekt indiziert ist, erfordern diese Berichte können keine Tabellen-Scans überhaupt.

Wirklich, für ein Problem wie das sollten Sie die Berichte auf einfache Weise kodieren und dann sehen, ob die Leistung die geschäftlichen Anforderungen erfüllt. Wenn nicht, dann betrachten Sie Optimierungsstrategien.

+0

Ich gebe deinen zweiten Punkt zu. Allerdings fordere ich Sie auf, ein Indexschema zu entwickeln, das es mir erlaubt, Statistiken über das "Mitarbeiteralter" in 10-Jahres-Bändern zu erhalten, die einen Tabellenscan vermeiden würden. – Aheho

+1

@Aheho um zusammenzufassen musst du scannen, wenn du männlich/weiblich tust dann ist der Index auch wertlos wegen sehr geringer Selektivität – SQLMenace

2

wenn Sie 5 Kreisdiagramme wollen und zusammenfassen müssen, dann müssen Sie 5 SQL-Anweisungen, da Ihre WHERE-Klausel ist für jede

+0

Nicht wahr. Ich könnte alle relevanten Datensätze zum Frontend ziehen und dann die Statistik in einer foreach() Schleife erstellen. – Aheho

+0

Ich spreche von reinem SQL, in Ihrem Fall müssten Sie nach allen verschiedenen Kriterien gruppieren und wie viele Zeilen zurück bringen? – SQLMenace

+0

Derzeit müsste der größte Bericht 30K-40K Reihen summieren. – Aheho

1

Sie können können einige Leistungssteigerungen durch Speichern von Zwischenergebnissen in einer Tabellenvariablen oder temporäre Tabelle, dann mehr Aggregation dagegen laufen. Beispiel mit nur zwei Ergebnissätzen:

SELECT COUNT(*) as cnt, State, AgeBracket 
INTO #t 
FROM YourTable 
GROUP BY State, AgeBracket; 

SELECT SUM(cnt) AS cnt, State FROM #t GROUP BY State; 
SELECT SUM(cnt) AS cnt, AgeBracket FROM #t GROUP BY AgeBracket; 
+0

Hey Alex, schön dich hier zu sehen :-) Denk dran, wenn du es tust (ich weiß Sie wissen das bereits) ein SELECT INTO gegen eine große Tabelle, die Sie sperren werden – SQLMenace

Verwandte Themen