Как лучше всего суммировать несколько логических значений через SQL? - PullRequest
0 голосов
/ 06 мая 2009

У меня есть таблица, которая содержит, среди прочего, около 30 столбцов логических флагов, которые обозначают определенные атрибуты. Я хотел бы вернуть их, отсортированные по частоте, в виде набора записей вместе с именами их столбцов, например:

Attribute    Count
attrib9      43
attrib13     27 
attrib19     21
etc.

Мои усилия до сих пор могут привести к чему-то похожему, но я могу получить атрибуты в столбцах только с помощью условных сумм, например:

SELECT SUM(IIF(a.attribIndex=-1,1,0)), SUM(IIF(a.attribWorkflow =-1,1,0))...

Кроме того, запрос уже становится немного громоздким со всеми 30 SUM / IIF и не будет обрабатывать изменения количества атрибутов без ручного вмешательства.

Первые шесть символов столбцов атрибута одинаковы (attrib) и уникальны в таблице. Можно ли использовать подстановочные знаки в именах столбцов для выбора всех применимых столбцов?

Кроме того, можно ли повернуть результаты, чтобы получить отсортированный набор записей из двух столбцов?

Я использую Access 2003, и запрос в конечном итоге будет через ADODB из Excel.

Ответы [ 3 ]

1 голос
/ 06 мая 2009

Это зависит от того, есть ли у вас имена атрибутов где-либо в данных . Если вы это сделаете, то ответ птичьих губ поможет. Тем не менее, если имена являются только именами столбцов, у вас есть немного больше работы, и я боюсь, что вы не можете сделать это с простым SQL.

Нет, вы не можете использовать подстановочные знаки для имен столбцов в SQL. Для этого вам понадобится процедурный код (например, модуль VB в Access - вы можете сделать это в хранимой процедуре, если вы работаете на SQL Server). Используйте этот код для построения кода SQL.

Это не будет красиво. Я думаю вам нужно будет делать это по одному атрибуту за раз: выберите строку, значением которой является имя этого атрибута и count-where-True, затем либо A) запустите ее и сохраните результат Новая строка в «Скретч-таблице» или B) добавьте все эти выборки вместе с «Union» между ними перед запуском пакета.

Мой Access VB более чем ржавый, поэтому я не доверяю себе, чтобы дать вам что-то вроде исполняемого кода ....

1 голос
/ 06 мая 2009

Просто счетчик и группа по должны это сделать

  Select attribute_name
         , count(*)
      from attribute_table
    group by attribute_name

Чтобы ответить на ваш комментарий, используйте для этого Аналитические функции:

 Select attribute_table.*
        , count(*) over(partition by attribute_name) cnt
   from attribute_table
0 голосов
/ 06 мая 2009

В Access для запросов кросс-таблиц (традиционного инструмента для транспонирования наборов данных) требуется как минимум 3 числовых поля / поля даты. Однако, поскольку вывод выполняется в Excel, вы рассматривали возможность вывода данных на скрытый лист с последующим использованием сводной таблицы?

...