Я знаю, что здесь есть несколько дискуссий о развороте/перекрестном применении, но мне не удалось найти ни одной дискуссии, посвященной моей проблеме. На данный момент у меня есть следующее:
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
Теперь я хотел бы добавить несколько других столбцов, например. один с именем Bonus, который я также хочу поместить в Perc10, Perc25 и Median Rows.
В качестве альтернативы я также сделал запрос с перекрестным применением, но здесь кажется, что вы не можете «принудительно» отсортировать строки, как вы можете с помощью unpivot. Другими словами, у меня не может быть пользовательской сортировки, а только сортировка по номеру в таблице, если я прав? По крайней мере, здесь я получаю желаемый результат, но строки расположены в неправильном порядке, и у меня нет имен строк, таких как Perc10 и т. д., что было бы неплохо.
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 означает процентиль здесь.
Вывод должен быть примерно таким:
+--------------+---------+-------+
| Calculation | Salary | Bonus |
+--------------+---------+-------+
| Perc10 | 25 | 5 |
| Perc25 | 35 | 10 |
| Median | 27 | 8 |
+--------------+---------+-------+
Я что-то пропустил или я что-то не так сделал? Я использую MSSQL 2014, вывод идет в SSRS. Большое спасибо за любую подсказку заранее!
Изменить для уточнения: метод Unpivot дает следующий результат:
+--------------+---------+
| Calculation | Salary |
+--------------+---------+
| Perc10 | 25 |
| Perc25 | 35 |
| Median | 27 |
+--------------+---------+
поэтому здесь отсутствует столбец «Бонус».
Метод Cross-Apply дает следующий результат:
+---------+-------+
| Salary | Bonus |
+---------+-------+
| 35 | 10 |
| 25 | 5 |
| 27 | 8 |
+---------+-------+
Поэтому, если вы сравните его с предполагаемым результатом, вы заметите, что столбец «Расчет» отсутствует, а сортировка строк неверна (обратите внимание, что строка 25 | 5 находится во второй строке, а не в первой).
Правка 2: определение представления и образцы данных. Представление просто добавляет вычисляемые столбцы таблицы. В таблице у меня есть такие столбцы, как «Зарплата» и «Бонус» для каждого JobID. Затем представление просто вычисляет процентили следующим образом:
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
Таким образом, вывод выглядит следующим образом:
+----+-------+---------+-----------+-----------+
| 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 |
+----+-------+---------+-----------+-----------+
В конце представление будет параметризовано в хранимой процедуре.
vCalculatedView
, кажется, выполняет расчеты заранее... Вашgroup by
ничего не делает... Пожалуйста, покажите результат, который вы получаете в своем заявлении, и предоставьте некоторые примерные данные и ожидаемый результат. - person Shnugo   schedule 22.03.2016CTE
сSELECT DISTINCT
- это то, что вам нужно.GROUP BY
вы бы использовали для агрегирования, напримерMAX()
илиSUM()
Укажите результат вашего текущего запроса и способ отображения ваших данных. - person Shnugo   schedule 22.03.2016vCalculatedView
? Определение VIEW также может помочь. Я не понимаю, до какого уровня там делается агрегация... - person Shnugo   schedule 22.03.2016