WedX - журнал о программировании и компьютерных науках

Как перенести строки в столбец в TSQL?

Сценарий (указанный ниже) дает результат (см. снимок экрана 01)Снимок экрана 01. результат должен отображаться как (см. screenshot02)Screenshot02.

Дата в work_date (см. снимок экрана 01) должна отображаться в виде отдельного столбца даты, а часы в work_hour (см. снимок экрана 01) должны отображаться в отдельном столбце даты.

DECLARE @01_STARTDATE VARCHAR(100);
DECLARE @02_ENDDATE VARCHAR(100);
DECLARE @STAFF INT;

SET @01_STARTDATE = '2017-07-06';
SET @02_ENDDATE = '2017-07-10';
SET @STAFF = 8;

SELECT   
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range],
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff,
    f.FACILITY_NAME AS Site_Name,
    P.PRJ_PROJECT_NAME AS Project_Name,
    R.PROJECT_TYPE_NAME AS Project_Type_Brownfield,
    '' AS Project_Type_VRP,
    st.work_hour, st.work_date
FROM 
    FAC_FACILITY AS f
INNER JOIN 
    GOV.PRJ_PROJECT AS P ON f.FACILITY_RID = p.FACILITY_RID
INNER JOIN 
    GOV.SYS_TIME_LOG AS ST ON ST.PRJ_PROJECT_RID = P.PRJ_PROJECT_RID
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID
LEFT JOIN 
    GOV.REF_PROJECT_TYPE AS R ON P.PROJECT_TYPE_RID = R.PROJECT_TYPE_RID
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE)
    AND ST.USER_RID = @STAFF        
    AND R.PROJECT_TYPE_RID = 3
GROUP BY 
    f.FACILITY_NAME, P.PRJ_PROJECT_NAME, SU.FIRST_NAME,
    st.work_date, SU.LAST_NAME, R.PROJECT_TYPE_NAME,
    st.work_hour

UNION ALL

SELECT   
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range],
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff,
    f.FACILITY_NAME AS Site_Name,
    P.PRJ_PROJECT_NAME AS Project_Name,
    '' AS Project_Type_Brownfield,
    R.PROJECT_TYPE_NAME AS Project_Type_VRP,
    st.work_hour, st.work_date
FROM
    FAC_FACILITY AS f
INNER JOIN 
    GOV.PRJ_PROJECT AS P ON f.FACILITY_RID = p.FACILITY_RID
INNER JOIN 
    GOV.SYS_TIME_LOG AS ST ON ST.PRJ_PROJECT_RID = P.PRJ_PROJECT_RID
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID
LEFT JOIN 
    GOV.REF_PROJECT_TYPE AS R ON P.PROJECT_TYPE_RID = R.PROJECT_TYPE_RID
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE)
    AND ST.USER_RID = @STAFF        
    AND R.PROJECT_TYPE_RID = 2
GROUP BY 
    f.FACILITY_NAME, P.PRJ_PROJECT_NAME, SU.FIRST_NAME,
    st.work_date, SU.LAST_NAME, R.PROJECT_TYPE_NAME,
    st.work_hour

UNION ALL

SELECT   
    @01_STARTDATE + ' - ' + @02_ENDDATE AS [Date Range],
    SU.FIRST_NAME + ' ' + SU.LAST_NAME AS Staff,
    g.grant_name AS Site_Name,
    '' AS project_name,
    '' AS Project_Type_Brownfield,
    '' AS Project_Type_VRP,
    st.work_hour, st.work_date
FROM
    (SELECT 
         SUM(work_hour) AS work_hour, user_rid,
         grant_rid, work_date
     FROM  
         GOV.SYS_TIME_LOG
     WHERE 
         WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE)
         AND USER_RID = @STAFF        
         AND grant_rid = 1
     GROUP BY 
         grant_rid, user_rid, work_date) AS ST
LEFT JOIN 
    SEC_USER AS SU ON SU.USER_RID = ST.USER_RID
LEFT JOIN 
    SYS_GRANT AS G ON st.grant_rid = g.grant_rid
WHERE 
    ST.WORK_DATE BETWEEN CAST(@01_STARTDATE AS DATE) AND CAST(@02_ENDDATE AS DATE)
    AND ST.USER_RID = @STAFF        
    AND st.grant_rid = 1
GROUP BY 
    SU.FIRST_NAME, st.work_date, SU.LAST_NAME,
    G.Grant_name, st.work_hour;
13.10.2017


Ответы:


1

Существует множество доступных примеров того, как "повернуть" вывод, например первое изображение, чтобы оно выглядело как второе. Кроме того, поскольку вы изменяете диапазон дат с помощью параметров, вам потребуется использовать "динамический sql" для создания "динамических имен столбцов".

Обратите внимание, что вам не нужно запускать 3 отдельных запроса для сбора необходимой информации, но вы должны подождать до самого последнего момента в своем запросе, чтобы подавить вывод значений. В идеале вы бы вообще не делали этого с помощью SQL, а выполняли бы это на «уровне представления» (этот запрос выглядит так, как будто он предназначен для отчета, и большинство продуктов для отчетов поддерживают условный вывод данных).

Это просто усложнит ваш запрос и сделает поворот более достижимым, если вы включите PROJECT_TYPE_RID как в предложение select, так и в предложение group by, вы можете управлять выводом, используя выражения case, подобные этому:

    case when R.PROJECT_TYPE_RID = 1 then '' else Project_Name end  AS Project_Name,
    case when R.PROJECT_TYPE_RID = 3 then R.PROJECT_TYPE_NAME else '' end AS Project_Type_Brownfield,
    case when R.PROJECT_TYPE_RID = 2 then R.PROJECT_TYPE_NAME else '' end AS Project_Type_VRP,

НО обратите внимание, так как вы хотите использовать ПОВОРОТ, вы НЕ сможете сделать это таким образом, чтобы подавить значения, пока ПОСЛЕ выполнения поворота не будет выполнено.

14.10.2017
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]