2016-03-22 12 views
6

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.

+1

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

+0

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

+0

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

Antwort

1

Könnte dies Ihr Ansatz sein?

Nach Ihren Änderungen verstehe ich, dass Ihre Lösung mit CROSS APPLY mit den richtigen Daten zurückkommt, aber nicht in der richtigen Ausgabe. Sie können konstante Werte zu Ihrem VALUES hinzufügen und SELECT in einem Wrapper um die Sortierung tun:

SELECT wrapped.Calculation, 
     wrapped.Salary, 
     wrapped.Bonus 
FROM 
(
    SELECT crossapplied.* 
    FROM vCalculatedView v 
    CROSS APPLY (
     VALUES 
       (1,'Perc10',Salary_10, Bonus_10) 
      , (2,'Perc25',Salary_25, Bonus_25) 
      , (3,'Median',Salary_Median, Bonus_Median) 
    ) crossapplied (SortOrder,Calculation,Salary, Bonus) 
    WHERE JobID = '1' 
    GROUP BY crossapplied.SortOrder, 
      crossapplied.Calculation, 
      crossapplied.Salary, 
      crossapplied.Bonus 
) AS wrapped 
ORDER BY wrapped.SortOrder 
+0

Danke! Ich habe deine Lösung als richtig markiert. Für andere Leser müssen Sie jedoch alle Spalten (SortOrder, Calculation, Salary, Bonus) in die GROUP BY-Klausel einfügen, nicht nur Salary und Bonus. Letzte Nacht habe ich die Abfrage mit der UNPIVOT-Methode mit CTE und LEFT JOIN geschrieben, aber das ist natürlich ein viel längerer Code. Damit die Leser kommen, werde ich dies als eine andere Antwort hinzufügen, aber das ist nicht um Ihre Lösung zu schlagen. Ihre Lösungen zeigen einmal mehr, dass CROSS APPLY meistens Unpivot schlägt, wie zahlreiche Blogger im Vergleich zeigen. – ksauter

+1

Danke für die Annahme! Ich habe meine Antwort bearbeitet, um Ihren Hinweis auf "GROUP BY COLUMNS" zu reflektieren. Wenn Sie meine Antwort mögen, wäre es nett, zusätzlich zu stimmen. Abstimmen und Akzeptieren sind zwei separate Schritte ... Nochmals! – Shnugo

Verwandte Themen