Необходимо создать подзапрос в Access 2016, который дает отчетливый счет

Итак, я пытаюсь создать запрос, который вернет общий вес продуктов, вынутых из нашего кухонного шкафа студентами (я работаю в университетском кухонном шкафу), и я могу получить его, чтобы дать мне все необходимые мне итоги, кроме для подсчета отдельных студентов, которые приходят. По сути, мне нужно, чтобы он давал мне количество разных студентов, которые приходят, а не количество транзакций, которые он дает мне прямо сейчас. Кто-нибудь знает, как это исправить? Текущий код ниже:

Student_ID - это поле, в котором мне нужен подзапрос, если я прав...

SELECT DISTINCTROW 
    Format$([Transaction Table].[Date],'mmmm yyyy') AS [Month], 
    Sum([Transaction Table].Weight) AS [Total Weight], 
    Count(*) AS [Total Transaction], 
    Count([Transaction Table].Student_ID) AS [Unique Customers]
FROM [Transaction Table]
GROUP BY 
    Format$([Transaction Table].[Date],'mmmm yyyy'), 
    Year([Transaction Table].[Date])*12+DatePart('m',[Transaction Table].[Date])-1;

person Kade Johanning    schedule 08.06.2017    source источник
comment
Я не уверен, что это можно сделать без какого-либо соединения, поскольку вам нужны как отдельные транзакции, и отдельные студенты. Это просит подмножество внутри подмножества. Раньше мы создавали ключевое поле в основном запросе (т. е. SELECT 1 как ключ), а затем делали то же самое в другом запросе и просто соединяли два поля по ключевому полю, поскольку они идентичны. Возможно, вам придется сделать что-то подобное здесь, хотя похоже, что вы группируете по месяцу/году, поэтому вы, вероятно, можете использовать это вместо ключа.   -  person Johnny Bones    schedule 08.06.2017


Ответы (2)


Если вам нужно только количество отдельных студентов на дату, вы можете использовать следующее:

SELECT Count(Student_ID) As StudentCount, ShortDate
FROM 
   (SELECT Student_ID, Format$([Date], "Short Date") As ShortDate
    FROM [Transaction Table] 
    GROUP BY Student_ID, Format$([Date], "Short Date"))
GROUP BY ShortDate

Тогда вы можете присоединиться к нему на дату.

Однако сделать это в одном выражении будет сложно, так как Access не любит вложенных подзапросов.

person Erik A    schedule 08.06.2017
comment
Единственная проблема заключается в том, что мне нужно, чтобы он предоставил мне всю информацию, которая есть на данный момент, но мне также нужно, чтобы он дал мне отчетливый счет в поле Student_ID. Все остальное дает мне нужные мне цифры. Моя самая большая проблема на данный момент, я думаю, заключается в том, что я понятия не имею, как Access запускает подзапросы... - person Kade Johanning; 08.06.2017
comment
Вы можете просто использовать это в отдельном запросе, а затем соединить запрос со своим на дату. - person Erik A; 08.06.2017
comment
Я извиняюсь за то, что звучу как дурак, но как это сделать, ха-ха? Я никогда раньше не делал никаких соединений. - person Kade Johanning; 08.06.2017
comment
Допустим, вы сохранили мой запрос и назвали его QueryA. Затем вы можете использовать следующий код: SELECT DISTINCTROW Format$([Date],'mmmm yyyy') AS [Month], Sum([Transaction Table].Weight) AS [Total Weight], Count(*) AS [Total Transaction], Count([Transaction Table].Student_ID) AS [Unique Customers], StudentCount FROM [Transaction Table] INNER JOIN QueryA ON Format$([Date], "Short Date") = ShortDate GROUP BY Format$([Transaction Table].[Date],'mmmm yyyy'), Year([Transaction Table].[Date])*12+DatePart('m',[Transaction Table].[Date])-1, Studentcount; - person Erik A; 09.06.2017

Я понял! Моя проблема заключалась в том, что я пытался связать все поля месяца вместе. Что мне нужно было сделать, так это создать два запроса, чтобы сначала подсчитать отличительных клиентов по месяцам, еще один, чтобы получить количество транзакций и вес в месяц, а затем написать окончательный запрос, чтобы объединить все поля, которые мне нужны, вместе. Фиксированный код ниже:

Запрос количества транзакций:

SELECT DISTINCTROW 
    Format$([Transaction Table].[Date],'mm/yyyy') AS [Month],
    Sum([Transaction Table].Weight) AS [Total Weight], 
    Count(*) AS [Total Transactions]
FROM [Transaction Table]
GROUP BY 
    Format$([Transaction Table].[Date],'mm/yyyy'), 
    Year([Transaction Table].[Date])*12+DatePart('m',[Transaction Table].[Date])-1;

Уникальный запрос количества клиентов:

SELECT DISTINCTROW 
    [Month], 
    Count(ID) AS [Unique Customers]
FROM
    (SELECT DISTINCT 
        [Student_ID] AS ID, 
        Format$([Date],'mm/yyyy') AS [Month] 
    FROM [Transaction Table])  AS [%$##@_Alias]
GROUP BY 
    [Month], 
    Year([Month])*12+DatePart('m',[Month])-1;

Окончательный запрос для объединения результатов первых двух:

SELECT 
    [Transaction Montly Query].Month, 
    [Transaction Montly Query].[Total Weight], 
    [Transaction Montly Query].[Total Transactions], 
    Format$(([Total Weight]/[Total Transactions]),'#.00') AS [Weight per Transaction], 
    [Unique Customer Query].[Unique Customers], 
    Format$(([Total Weight]/[Unique Customers]),'#.00') AS [Weight per Costomer], 
    Format$(([Total Transactions]/[Unique Customers]),'#.00') AS [Transactions per Customer]
FROM [Transaction Montly Query] 
    RIGHT JOIN [Unique Customer Query] 
        ON [Transaction Montly Query].Month = [Unique Customer Query].Month
GROUP BY 
    [Transaction Montly Query].Month, 
    [Transaction Montly Query].[Total Weight], 
    [Transaction Montly Query].[Total Transactions], 
    [Unique Customer Query].[Unique Customers]
ORDER BY [Transaction Montly Query].Month;
person Kade Johanning    schedule 12.06.2017