Был быстрый взгляд и не мог найти мой вопрос снова. Поэтому я надеюсь, что кто-то здесь может помочь. У меня есть большая таблица с аналогичной структурой ниже.
DateTime | InboundUserID | OutboundUserID | CustomerUserID | Cost | Mins | Account Number
Я пытаюсь сгруппировать эти данные в часовые куски и сохранить результат в другой таблице с аналогичной структурой ниже.
Date | HourFrom | HourTo | SumMins | SumCost | OutboundUserID | CustomerUserID | Account Number
Я написал следующий код/запрос, чтобы сделать это, но это не совсем правильно. В основном группа с помощью не всех данных суммируется. Например, при просмотре вновь созданной таблицы у меня есть все данные OutboundUserID, но ни один из данных CustomerUserID.
for(int i=0;i <=23;i++)
{
for(int j=1 ; j <=31 ; j++)
{
String Time = String.format("%02d", i);
query = "INSERT DELAYED INTO correlated_calls_hourly " +
" SELECT DateOnly,HourFrom,HourTo,DURATION,CALLCOUNT,`Price Group ID`,INBOUNDCOST,INBOUNDREVENUE,`InboundCustomerID`,OUTBOUNDCOST,OUTBOUNDREVENUE,`Outbound Customer ID`,`Customer ID`,`Account Number`,`Service` FROM" +
" ("+
" SELECT "+
/* snip sum(),case and date/time part of query */
" GROUP BY DateOnly,`InboundCustomerID`,`OutboundCustomerID`,`CustomerID`,`AccountNumber`,`PriceGroupID`,`Service`" +
" )a ";
}
}
Я уже сделал шаг по созданию трех разных таблиц, чтобы суммировать данные отдельно с помощью OutboundUserID/InboundUserID/CustomerUserID. Но было бы намного более элегантно, если бы я мог просто правильно подготовить эту сводную таблицу.
Если бы кто-нибудь мог помочь мне подумать о том, как получить желаемый результат через один SQL-запрос, я был бы очень благодарен.
Большое спасибо заранее
Алан
После небольшого вдохновения я понял, что решение было очевидно. Соедините столбцы вместе и выполните группу в объединенной колонке.
CONCAT (InboundUserID, '', OutboundUserID, '', CustomerUserID) как uniqueKey GROUP BY uniqueKey.
Что-то вроде этой работы?
INSERT INTO correlated_calls_hourly (Date, HourFrom, HourTo, SumMins, SumCost, OutboundUserID, CustomerUserID, AccountNumber)
SELECT
CONVERT(varchar(8), GETDATE(), 112),
hour(DateTime),
hour(DateTime) + 1,
SUM(Mins),
SUM(Cost),
OutboundUserID,
CustomerUserID,
AccountNumber
GROUP BY
CONVERT(varchar(8), GETDATE(), 112),
hour(DateTime)
OutboundUserID,
CustomerUserID,
AccountNumber
Функция преобразования преобразует дату и время в дату. Вам, вероятно, придется немного подстроить его в соответствии с вашими РСУБД, но я не вижу причин, почему это не сработает.