Есть ли альтернатива написанию оператора SQL-запроса для отображения значения отдельного столбца в одной строке? - PullRequest
0 голосов
/ 29 апреля 2019

Я получаю оператор SQL-запроса для подготовки статистического отчета. В В моем отчете мне нужно отображать значения в нескольких отдельных столбцах. Эти column имеют разные числовые диапазоны. (I.e.1, 2-4, 5-10, 11-19, 20-49, TotalForEachCategory). Как мне сформулировать мой запрос SQL, чтобы сделать то же самое? В настоящее время эти значения находятся в отдельных строках.

Я работаю над подготовкой отчета SSRS. Для этого мне нужно разработать SQL заявления. отражающие в отчете столбцы не являются физическими в таблице SQL. Следовательно, мне нужно получить их с помощью агрегации SQL. Например, я необходимо отобразить «Общее количество перевозчиков автопарка» для каждой категории попадая под разные диапазоны флота.

В настоящее время мои результаты появляются, как показано ниже. (Неверный)

                            Fleet Ranges
----------------------------------------------------------------------
|  1  |  2-4  |  5-10  | 11-19  |  20-49  | TotalForCategory
----------------------------------------------------------------------
| 70  |   0   |   0    |   0    |    0    |        70
| 0   |  38   |   0    |   0    |    0    |        38
| 0   |   1   |   0    |   0    |    0    |         1
| 0   |   0   |  27    |   0    |    0    |        27

Current incorrect result

Что я пробовал до сих пор

SQL-запрос:

SELECT
    (CASE WHEN F.mot_averagefleetsize = 1 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_1',
    (CASE WHEN F.mot_averagefleetsize BETWEEN 2 AND 4 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_2-4',
    (CASE WHEN F.mot_averagefleetsize BETWEEN 5 AND 10 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_5-10',
    (CASE WHEN F.mot_averagefleetsize BETWEEN 11 AND 19 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_11-19',
    (CASE WHEN F.mot_averagefleetsize BETWEEN 20 AND 49 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_20-49'
FROM
    Table1 F
INNER JOIN 
    Table2 M ON M.column1 = F.column2
GROUP BY
    F.mot_averagefleetsize

Мой ожидаемый результат должен быть таким:

                                  Fleet Ranges
----------------------------------------------------------------------
           |  1  |  2-4  |  5-10  | 11-19  |  20-49  | TotalForCategory
----------------------------------------------------------------------
Category #1| 70  |  39   |  27    |   0    |    0    |       136
           |

1 Ответ

0 голосов
/ 30 апреля 2019

с использованием SUM после агрегирования производных таблиц.вам нужно будет указать поле категории

select 
categoryfield,
sum (Fleet_Range_1) Fleet_Range_1
sum (Fleet_Range_2-4) Fleet_Range_2-4
sum (Fleet_Range_5-10) Fleet_Range_5-10
sum (Fleet_Range_11-1) Fleet_Range_11-1
sum (Fleet_Range_20-49) Fleet_Range_20-49
from (
select
categoryfield
,(CASE WHEN F.mot_averagefleetsize = 1 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_1'
,(CASE WHEN F.mot_averagefleetsize BETWEEN 2 AND 4 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_2-4'
,(CASE WHEN F.mot_averagefleetsize BETWEEN 5 AND 10 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_5-10'
,(CASE WHEN F.mot_averagefleetsize BETWEEN 11 AND 19 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_11-19'
,(CASE WHEN F.mot_averagefleetsize BETWEEN 20 AND 49 THEN COUNT(M.mot_carriernumbername) ELSE 0 END) AS 'Fleet_Range_20-49'
from Table1 F
inner join Table2 M on M.column1 = F.column2
group by F.mot_averagefleetsize, categoryfield
) x
group by categoryfield
...