Изменение данных с агрегированного на детализированный уровень

Мои данные в виде:

enter image description here

Чтобы воспроизвести:

    DROP TABLE IF EXISTS SALARY;
    CREATE TEMP TABLE salary
    (
     Employee varchar(100),
     Salary1 numeric(38,12),
     Salary2 numeric(38,12)
    );
   INSERT INTO salary (Employee, Salary1 ,Salary2)
   VALUES ('A1',100,300),('A2',200,300),('A3',300,450),('A4',400,600); 

Я хочу разделить его равномерно (поскольку у нас есть данные о зарплате за 2 дня, объединенные в 1 столбец) и преобразовать его в данные ежедневного уровня, как показано ниже:

enter image description here

Следовательно, если вы видите для сотрудника A2 - сумма зарплаты за 3 и 4 мая будет 300 (150+150 из 2-й таблицы). Любая помощь / руководство приветствуется.

У вас В самом деле есть столбец под названием [Salary- 1st May,2nd May]? С этим будет ужасно работать. Откуда вы знаете, за какой год эти данные? Почему в первом столбце между днем ​​и месяцем есть пробел, а во втором нет? Это ужасно непоследовательно. Честно говоря, я думаю, что вам нужно получить (бедняжка) один, чтобы сделать это вручную.

Larnu 17.05.2022 12:40

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

user2458552 17.05.2022 12:42

Спасибо, но я не понимаю, как я могу загрузить сюда таблицу, так как у меня нет возможности вставить таблицу.

user2458552 17.05.2022 12:45

@ user2458552, запишите таблицу как оператор CREATE и опубликуйте как код вместе с операторами INSERT для вашего примера данных.

Dan Guzman 17.05.2022 12:55

В качестве альтернативы, @user2458552, вы можете, по крайней мере, использовать хорошо отформатированную табличную text или таблицу уценки.

Larnu 17.05.2022 13:03

@Dan Guzman - Добавлено!

user2458552 17.05.2022 13:06

если столбцы просто называются Salary1 и Salary2 (а не [Salary- 1st May,2nd May] и [Salary- 3rdMay,4thMay] соответственно), как узнать, для каких дат эти значения?

Larnu 17.05.2022 13:12

Имена полей столбцов не указывают даты, к которым нам нужно идти, это известно. В данном примере это конкретные даты 1-2 и 3-4 числа.

user2458552 17.05.2022 13:19

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

user2458552 17.05.2022 13:23

@ user2458552, сотрудник A1 в желаемых результатах не соответствует вашему описанию. Кажется, 03.05.2022 и 04.05.2022 должно быть 150 (300/2) вместо 75.

Dan Guzman 17.05.2022 13:54
"это известено" Кем/чем? Ты? Это нехорошо для SQL Server. Где физически хранится Salary1 для дат 2022-05-01 и 2022-05-02? Если это не так, то вы необходимость сохраняете эти данные где-то. У вас есть только столбцы Salary1 и Salary2? Есть ли Salary3, Salary4? Возможно Salary279?
Larnu 17.05.2022 14:05
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
12
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Материализованный календарный стол с нужными датами упростит создание дат, необходимых для запроса. Без него альтернативным методом является счетная таблица или CTE (как в приведенном ниже примере).

DECLARE
      @StartDate date = '2022-05-01'
    , @DaysPerSalary int = 2;
WITH
     t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
    ,tally AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num  FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
    ,salary1 AS (
        SELECT Employee, Salary1 / @DaysPerSalary AS Salary
        FROM SALARY
    )
    ,salary2 AS (
        SELECT Employee, Salary2 / @DaysPerSalary AS Salary
        FROM SALARY
    )
SELECT DATEADD(day, tally.num-1, @StartDate), Employee, Salary
FROM tally
CROSS JOIN salary1
WHERE tally.num <= @DaysPerSalary
UNION ALL
SELECT DATEADD(day, tally.num-1 + @DaysPerSalary, @StartDate), Employee, Salary
FROM tally
CROSS JOIN salary2
WHERE tally.num <= @DaysPerSalary
ORDER BY Employee, Salary;

Другие вопросы по теме