Как я комбинирую/объединяю столбцы от двух результатов SQL-запроса?

Расширяя ответ @ 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                                                      
7
задан Kev 29 June 2009 в 16:52
поделиться

5 ответов

Я понятия не имею, как вы рассчитываете свой 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)
3
ответ дан 7 December 2019 в 12:24
поделиться

используйте union или union all для объединения двух результатов.

2
ответ дан 7 December 2019 в 12:24
поделиться

ну, у вас есть два запроса ... так что я бы подумал, что вы могли бы просто использовать эти два запроса как «таблицы» в запросе оболочки и объединить их


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, но у меня нет реального опыта работы со сводными таблицами, и это может быть отбой

1
ответ дан 7 December 2019 в 12:24
поделиться

Этот ответ исходит из школы SQL-запросов Agile / YAGNI .....

Обязательно ли должен быть отчет в этом формате? Более простой, более удобный в обслуживании запрос мог бы вернуть правильную информацию, просто он был бы представлен немного иначе. Следующий запрос возвращает данные в несколько другом формате?

SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets
FROM BWHourlyReadings
GROUP BY serviceid, hour
ORDER BY serviceid, hour
-1
ответ дан 7 December 2019 в 12:24
поделиться

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

0
ответ дан 7 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: