Ich weiß, dass es hier mehrere Unpivot/Cross-Apply-Diskussionen gibt, aber ich konnte keine Diskussion finden, die mein Problem abdeckt. Was ich bisher habe, ist folgendes:TSQL Mehrfachspalten mit den angegebenen Reihen möglich?
SELECT Perc, Salary
FROM (
SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median
FROM vCalculatedView
WHERE JobID = '1'
GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median]
) a
UNPIVOT (
Salary FOR Perc IN (Perc10, Perc25, Median)
) AS calc1
Nun, was ich möchte, ist es, mehrere andere Spalten, z. ein benannter Bonus, den ich auch in Perc10, Perc25 und Median Rows setzen möchte.
Als Alternative habe ich auch eine Abfrage mit cross apply gemacht, aber hier scheint es, als ob Sie die Zeilen nicht "erzwingen" können, wie Sie es mit pivot machen können. Mit anderen Worten, ich kann keine benutzerdefinierte Sortierung haben, sondern nur eine Sortierung, die einer Zahl innerhalb der Tabelle entspricht, wenn ich richtig liege? Zumindest bekomme ich hier das Ergebnis, wie ich es gerne hätte, aber die Zeilen sind in einer falschen Reihenfolge und ich habe keine Zeilennamen wie Perc10 usw., was nett wäre.
SELECT crossapplied.Salary,
crossapplied.Bonus
FROM vCalculatedView v
CROSS APPLY (
VALUES
(Salary_10, Bonus_10)
, (Salary_25, Bonus_25)
, (Salary_Median, Bonus_Median)
) crossapplied (Salary, Bonus)
WHERE JobID = '1'
GROUP BY crossapplied.Salary,
crossapplied.Bonus
Perc steht hier für Perzentil. so etwas wie dieses
Output soll sein:
+--------------+---------+-------+
| Calculation | Salary | Bonus |
+--------------+---------+-------+
| Perc10 | 25 | 5 |
| Perc25 | 35 | 10 |
| Median | 27 | 8 |
+--------------+---------+-------+
Muss ich etwas vermissen oder habe ich etwas falsch? Ich benutze MSSQL 2014, Ausgabe geht in SSRS. Vielen Dank für einen Hinweis im Voraus!
Bearbeiten zur Klarstellung: Die Unpivot-Methode gibt die folgende Ausgabe:
+--------------+---------+
| Calculation | Salary |
+--------------+---------+
| Perc10 | 25 |
| Perc25 | 35 |
| Median | 27 |
+--------------+---------+
so fehlt es in der Spalte "Bonus" hier.
The Cross-Apply-Methode gibt die folgende Ausgabe:
+---------+-------+
| Salary | Bonus |
+---------+-------+
| 35 | 10 |
| 25 | 5 |
| 27 | 8 |
+---------+-------+
Also, wenn Sie sie an den gewünschten Ausgang zu vergleichen, werden Sie feststellen, dass die Spalte „Berechnung“ fehlt und die Zeile Sortierung ist falsch (Beachten Sie, dass die Zeile 25 | 5 in der zweiten Zeile statt in der ersten Zeile steht).
Bearbeiten 2: Definitions- und Beispieldaten des Views: Die Ansicht fügt im Grunde nur berechnete Spalten der Tabelle hinzu. In der Tabelle habe ich Spalten wie Gehalt und Bonus für jede JobID. Die Ansicht berechnet dann nur die Perzentile wie folgt aus:
Select
Percentile_Cont(0.1)
within group (order by Salary)
over (partition by jobID) as Salary_10,
Percentile_Cont(0.25)
within group (order by Salary)
over (partition by jobID) as Salary_25
from Tabelle
So ist die Ausgabe wie:
+----+-------+---------+-----------+-----------+
| ID | JobID | Salary | Salary_10 | Salary_25 |
+----+-------+---------+-----------+-----------+
| 1 | 1 | 100 | 60 | 70 |
| 2 | 1 | 100 | 60 | 70 |
| 3 | 2 | 150 | 88 | 130 |
| 4 | 3 | 70 | 40 | 55 |
+----+-------+---------+-----------+-----------+
Am Ende wird die Ansicht in einer gespeicherten Prozedur parametriert werden.
Ihre 'vCalculatedView' scheint die Berechnungen im Voraus zu tun ... Ihre' Gruppe by' nichts tut ... Bitte zeigen Sie das Ergebnis, das Sie mit Ihrer Aussage erhalten, und geben Sie einige Beispieldaten und die erwartete Ausgabe an. – Shnugo
Die Gruppe von in der Cross Apply-Code tut etwas: Wenn ich es nicht einfügen würde, würde Perc10, Perc25, Median immer und immer wieder wiederholen. Dies liegt daran, dass eine Job-ID nicht die Mitarbeiter-ID ist und daher eine Job-ID mehr als einen Mitarbeiter enthalten kann. – ksauter
OK. Ich verstehe was du meinst. Könnte sein, dass ein "CTE" mit einem "SELECT DISTINCT" das ist, was Sie eher brauchen. 'GROUP BY' würden Sie für Aggregationen wie' MAX() 'oder' SUM() verwenden '' Bitte geben Sie das Ergebnis Ihrer aktuellen Anfrage an und wie Ihre Daten angezeigt werden sollen. – Shnugo