MS Access - показывать комбинации полей с использованием SQL TRANSFORM или аналогичных - PullRequest
0 голосов
/ 27 июня 2011

У меня есть таблица со списком типов жилья и людей, которые их используют.Некоторые люди используют более одного типа размещения.Как я могу показать количество людей, использующих каждый тип размещения, и количество в каждой комбинации возможных типов размещения?Пользователи в каждой категории уже уникальны в этой категории.

Например:

AccomType NameID
A         1
A         2
B         1
B         3
B         4
B         5
C         1
C         4

Мне бы хотелось, чтобы результат был похож на

AccomType Count
A         2
B         4
C         2
A&B       1
B&C       2
A&C       2
A&B&C     3

Не думаю, чтоTRANSFORM может сделать это, возможно ли сделать это в SQL?Я бы предпочел не использовать VBA, хотя может, если это единственный / самый простой способ.Кроме того, в той же таблице есть поле для года (08/09, 09/10 и т. Д.) Для фильтрации по тому, что я планирую использовать ГДЕ, если только это не влияет на предложенное кем-либо решение?

РЕДАКТИРОВАТЬ: Iпопробовал сводную таблицу, но это не позволит мне использовать одно и то же поле как для строки, так и для поля, а также не покажет, где происходит комбинация трех пересечений (A & B и C).

1 Ответ

0 голосов
/ 27 июня 2011

По сути, вам нужно сделать запрос для каждой группы, которую вы хотите сделать UNION.А затем посчитать результаты

SELECT 
    AccomType,
    SUM([Tick]) as Count

FROM (

    SELECT
        "A" as AccomType,  1 as Tick,  1 as SortOrder
    FROM
        Name_AccomType
    WHERE
        AccomType = "A"

    UNION ALL SELECT
           "B" as AccomType,  1 as Tick,  2 as SortOrder
    FROM
        Name_AccomType
    WHERE
        AccomType = "B"

    UNION ALL SELECT
        "C" as AccomType, 1 as Tick, 3 as SortOrder
    FROM
        Name_AccomType
    WHERE
        AccomType = "C"

    UNION ALL  SELECT 
        "A&B" as AccomType, 1 as Tick, 4 as SortOrder
    FROM 
        Name_AccomType
    WHERE
        AccomType  in ("A", "B")
    GROUP BY NameID
    HAVING COUNT(NameID) = 2

    UNION ALL  SELECT 
        "B&C" as AccomType, 1 as Tick, 5 as SortOrder
    FROM 
        Name_AccomType
    WHERE   
        AccomType  in ("B", "C")
    GROUP BY NameID
    HAVING COUNT(NameID) = 2

    UNION ALL  SELECT 
            "A&C" as AccomType, 1 as Tick, 6 as SortOrder
    FROM 
       Name_AccomType
    WHERE
       AccomType  in ("A", "C")
    GROUP BY NameID
    HAVING COUNT(NameID) = 2

    UNION ALL  SELECT 
            "A&B&C" as AccomType, 1 as Tick, 7 as SortOrder
    FROM 
       Name_AccomType
    WHERE
       AccomType  in ("A", "B", "C")
    GROUP BY NameID
    HAVING COUNT(NameID) = 3
) as t
GROUP BY 
    AccomType, 
    SortOrder
ORDER BY 
    SortOrder
...