Расширяя ответ @ Josh_Bode, вот мое собственное решение PyYAML, которое имеет преимущество в том, что является автономным подклассом yaml.Loader
. Он не зависит ни от глобальных переменных уровня модуля, ни от изменения глобального состояния модуля yaml
.
import yaml, os
class IncludeLoader(yaml.Loader):
"""
yaml.Loader subclass handles "!include path/to/foo.yml" directives in config
files. When constructed with a file object, the root path for includes
defaults to the directory containing the file, otherwise to the current
working directory. In either case, the root path can be overridden by the
`root` keyword argument.
When an included file F contain its own !include directive, the path is
relative to F's location.
Example:
YAML file /home/frodo/one-ring.yml:
---
Name: The One Ring
Specials:
- resize-to-wearer
Effects:
- !include path/to/invisibility.yml
YAML file /home/frodo/path/to/invisibility.yml:
---
Name: invisibility
Message: Suddenly you disappear!
Loading:
data = IncludeLoader(open('/home/frodo/one-ring.yml', 'r')).get_data()
Result:
{'Effects': [{'Message': 'Suddenly you disappear!', 'Name':
'invisibility'}], 'Name': 'The One Ring', 'Specials':
['resize-to-wearer']}
"""
def __init__(self, *args, **kwargs):
super(IncludeLoader, self).__init__(*args, **kwargs)
self.add_constructor('!include', self._include)
if 'root' in kwargs:
self.root = kwargs['root']
elif isinstance(self.stream, file):
self.root = os.path.dirname(self.stream.name)
else:
self.root = os.path.curdir
def _include(self, loader, node):
oldRoot = self.root
filename = os.path.join(self.root, loader.construct_scalar(node))
self.root = os.path.dirname(filename)
data = yaml.load(open(filename, 'r'))
self.root = oldRoot
return data
Я понятия не имею, как вы рассчитываете свой HourX (In | Out) на основе ваших (Input | Output) октетов, но следующие могут сработать для вас
SELECT
ServiceID
, [Hour1In] = SUM(CASE WHEN Hour = 1 THEN InputOctets ELSE 0 END)
, [Hour1Out] = SUM(CASE WHEN Hour = 1 THEN OutputOctets ELSE 0 END)
, [Hour2In] = SUM(CASE WHEN Hour = 2 THEN InputOctets ELSE 0 END)
, [Hour2Out] = SUM(CASE WHEN Hour = 2 THEN OutputOctets ELSE 0 END)
, [Hour3In] = SUM(CASE WHEN Hour = 3 THEN InputOctets ELSE 0 END)
, [Hour3Out] = SUM(CASE WHEN Hour = 3 THEN OutputOctets ELSE 0 END)
-- , ...
, [Hour24In] = SUM(CASE WHEN Hour = 24 THEN InputOctets ELSE 0 END)
, [Hour24Out] = SUM(CASE WHEN Hour = 24 THEN OutputOctets ELSE 0 END)
FROM
@BWHourlyReadings
GROUP BY
ServiceID
Протестировано со следующими данными.
DECLARE @BWHourlyReadings TABLE (ServiceID INT, Hour INT, InputOctets INTEGER, OutputOctets INTEGER)
INSERT INTO @BWHourlyReadings VALUES (27222, 1, 383088, 804249)
INSERT INTO @BWHourlyReadings VALUES (27222, 2, 270529, 688683)
INSERT INTO @BWHourlyReadings VALUES (27222, 3, 247251, 290124)
INSERT INTO @BWHourlyReadings VALUES (27222, 24, 236053, 239165)
используйте union или union all для объединения двух результатов.
ну, у вас есть два запроса ... так что я бы подумал, что вы могли бы просто использовать эти два запроса как «таблицы» в запросе оболочки и объединить их
select * from
(*insert your big-ass OutputOctets query SQL here*) oo,
(*insert your big-ass InputOctets query SQL here*) io
where oo.ServiceID = oi.ServiceID
или использовать INNER JOIN, если вы предпочитаю. это почти то же самое, что создать два представления из ваших запросов, а затем объединить эти представления.
PS: НЕ ПРОВЕРЕНО ... будет работать с прямым SQL, но у меня нет реального опыта работы со сводными таблицами, и это может быть отбой
Этот ответ исходит из школы SQL-запросов Agile / YAGNI .....
Обязательно ли должен быть отчет в этом формате? Более простой, более удобный в обслуживании запрос мог бы вернуть правильную информацию, просто он был бы представлен немного иначе. Следующий запрос возвращает данные в несколько другом формате?
SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets
FROM BWHourlyReadings
GROUP BY serviceid, hour
ORDER BY serviceid, hour
Создайте одну переменную @table и поместите все столбцы в эту таблицу, вставьте все значения в эту таблицу и, наконец, выберите из этой таблицы. означает, что если вам нужно 24 столбца, создайте таблицу с 24 столбцами и вставьте одну за другой строку в этот