2011-09-12 4 views
2

У меня есть таблица с полями: resourceID, work_date, stringValueВозникли проблемы с помощью Partition() в Access

Я пытаюсь построить запрос доступа, который будет показывать счетчик сколько различных resourceID чисел с данные stringValue происходят в каждую неделю за определенный диапазон дат. Использование partition(), кажется, самый простой подход, однако, когда я использую следующий запрос:

select partition([work_date],#6/6/2011#,#9/4/2011#,7),stringValue, 
count(resourceID) from 
(select distinct resourceID,work_date,stringValue from myTable) as subQuery 
group by partition([work_date],#6/6/2011#,#9/4/2011#,7), stringValue 

то у меня есть две проблемы:

-Мои даты в конечном итоге отформатирован в виде целых чисел, например:

:40699 
40700:40706 
40784:40790 

, тогда как я хочу, чтобы они появились, как, например, 6/6/2011:6/12/2011 (я также не хочу, значение :40699)

- resourceID подсчитывается более одного раза в неделю, если он появляется в течение более одного дня недели; Я просто хочу, чтобы он учитывался один раз за каждый stringValue, если он появляется на этой неделе. Я думал, что квалификатор distinct выполнит это, но это не так.

EDIT: Я решил лишний resourceID счет, поставив перегородку в подзапроса следующим образом:

select datePartition,stringValue,count(ID) 
from (select partition() as datePartition, stringValue, ID 
from (select distinct stringvalue,ID,work_date)) 
group by datePartition,stringvalue 

, а затем потянув count(ID) из этого подзапроса. Тем не менее, пока не удается определить форматирование даты.

ответ

1

Чтобы избавиться от диапазона, который заканчивается 40699, попробуйте пересмотреть часть подзапроса. Добавить WHERE условия для ограничения строк work_date значения> = # 6/6/2011 #

SELECT DISTINCT resourceID, work_date, stringValue 
FROM myTable 
WHERE work_date >= #6/6/2011#; 

Я не ясно, о вашем описании относительно повторяющихся строк из SELECT DISTINCT. Одна из возможностей может заключаться в том, что по крайней мере некоторые из ваших значений work_date содержат разные значения времени с той же даты. Таким образом, две строки с одинаковыми идентификаторами resourceID и stringValue, но значения work_date # 6/6/2011 01:00 AM # и # 6/6/2011 02:00 AM #, будут законно квалифицироваться как отличные.

Если это не объяснение, уточните свой вопрос, указав нам небольшой набор данных из myTable и набор результатов этих данных, который иллюстрирует, как вы хотите, чтобы данные оценивались.

AFAICT, вопрос о разделе(), представляющем ваши диапазоны дат как целые числа, неизбежен. Согласно теме справки, Partition() ожидает целых чисел для своих параметров. По-видимому, он готов принять ваши значения Date/Time, отбросив их до целых чисел. Но он не хочет/не может преобразовать их в современные строки. Вам придется преобразовать их обратно. Определяемая пользователем функция может делать это при вызове из запроса.

Public Function WholeNumRange2Date(ByVal pRange As String) 
    Const cstrFmt As String = "m/d/yyyy" 
    Dim varPieces As Variant 
    varPieces = Split(pRange, ":") 
    WholeNumRange2Date = Format(CDate(varPieces(0)), cstrFmt) & _ 
     ":" & Format(CDate(varPieces(1)), cstrFmt) 
End Function 

Пример из Immediate Window, который использует эту функцию ...

? WholeNumRange2Date("40700:40706") 
6/6/2011:6/12/2011 
+0

Я думал об использовании split() тоже, надеялся, что Access имеет более элегантное решение. Очевидно нет. Спасибо за подсказку об использовании предложения WHERE, чтобы избавиться от 40699. – sigil

2

Я вижу 2 решения, но я не вижу причины использовать раздел() здесь!
Решение 1: использование SELECT Format([DateFact];"ww-yyyy") as weekOfYear вернет номер недели и год: штраф для группировки по неделям, показывая номер недели.
Решение 2: использование SELECT [DateFact]-Weekday([datefact]+1) as weekStarting вернет первый день недели как красиво отформатированную дату: штраф за группировку по неделям, отображающий начальный день недели.

+0

ли вы проверить решение 2? Мне кажется, что он вернет последний день предыдущей недели, а не текущую неделю. – HansUp

+0

@ Hansup: нет, я не тестировал, вы, вероятно, правы 8-/... Возможно, нужно добавить выражение «+1». Я хотел показать принцип, который, я думаю, лучше, чем использование Partition() в этом случае. –

+0

Да, я вижу вашу точку ... +1 от меня. Ему придется внести корректировку, чтобы кормить начальный будний день, потому что, по-видимому, его недели начинаются по понедельникам (№ 6/6/2011 #) ... но это можно сделать. – HansUp

Смежные вопросы