Динамические столбцы SQL - PullRequest
       1

Динамические столбцы SQL

0 голосов
/ 26 января 2012

Я знаю, что это, вероятно, простая проблема, которую я полностью обдумываю, так что вот так:

У меня есть таблица LaborTransaction со следующими столбцами: (Таблица 1)

    Laborcode |   Hours   | OTHours | Tag
     JSMITH   |    2.0    |   0.0   | VACATION 
     JSMITH   |    4.0    |   3.0   | PERSONAL
     JSMITH   |    3.0    |   0.0   | VACATION
     JSMITH   |    5.0    |   1.0   | 
     JSMITH   |    7.0    |   4.0   | 

Мне нужно создать следующую таблицу: (Таблица 2)

Laborcode | Regular | Vacation | Personal | OT
 JSMITH   |  12.0   |   5.0    |   4.0    | 8.0 

По сути, мне просто нужно сложить все трудовые транзакции и проверить метку.
- Если тег (T1) не заполнен, то часы (T1) суммируются в обычном (T2)
- Если тег (T1) равен «ОТПУСК», то часы (T1) суммируются в отпуске (T2)
- Если тег (T1) «ЛИЧНЫЙ», то часы (T1) суммируются в личном (T2) - OTHours (T1) суммируется по ВСЕМ записям в OT (T2)

В моей первой попытке я сам присоединился к таблице, но получал дублированные результаты. Обычные, Отпускные, Личные и ОТ добавляли одну и ту же трудовую транзакцию несколько раз. Я использую MS SQL для создания второй таблицы. Любая помощь очень ценится! Спасибо!

Ответы [ 3 ]

3 голосов
/ 26 января 2012
select Laborcode,
    sum(case when Tag = '' then Hours end) as Regular,
    sum(case when Tag = 'VACATION' then Hours end) as Vacation,
    sum(case when Tag = 'PERSONAL' then Hours end) as Personal,
    sum(OTHours) as Overtime
from LaborTransaction 
group by Laborcode 
1 голос
/ 27 января 2012
Select
  LT.Laborcode
  , Sum(case when NullIf(LT.Tag, '') Is Null then Hours end) as Regular
  , Sum(case when LT.Tag = 'VACATIION' then Hours else end) as Vacation
  , Sum(case when LT.Tag = 'Personal' then Hours else end) as Personal
  , Sum(LT.OTHours) as OverTime
from LaborTransaction as LT
Group by LT.Laborcode

Это не совсем динамично.Если вы создадите другие значения тега, новые столбцы не будут созданы.Вам придется создать код для нового столбца.

1 голос
/ 26 января 2012

Вы можете сделать это с помощью ручного поворота с помощью CASE или использовать функцию PIVOT в SQL Server 2005 и более поздних версиях.

Если теги могут изменяться, вы можете использовать динамический SQL для генерации столбцов:

Сводка SQL Server 2005 для неизвестного числа столбцов

Сводная таблица и объединенные столбцы

PIVOT в sql 2005

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...