Помогите нам исправить это заявление SQL - PullRequest
1 голос
/ 02 февраля 2010

SELECT DISTINCT u.UserID, UserLastName, UserFirstName, UserName, Notified, 
MAX (CycleNumber) as CycleNumber, (CycleCurrentStep) as CycleCurrentStep, 
MAX (CycleDateReported) as CycleDateReported, 
max (cycleid)
FROM [User] u 
left join Cycle c on (u.UserID = c.UserID) 
join UserDivSection us on (u.UserID = us.UserID 
and us.DivSectionID=26) 
group by u.UserID, UserLastName, UserFirstName, UserName, Notified, c.CycleCurrentStep


UserID  UserLastName    UserFirstName   UserName    Notified    CycleNumber CycleCurrentStep    CycleDateReported   
290 Williams    Craig   craasdf@gmail.com   1   7   0       208
290 Williams    Craig   craasdf@gmail.com   1   9   3       210
290 Williams    Craig   craasdf@gmail.com   1   7   5   1/29/2010 3:06:23 PM    204
290 Williams    Craig   craasdf@gmail.com   1   8   6   2/1/2010 9:26:40 AM 209

Мы пытаемся вернуть строки с уникальными неповторяющимися идентификаторами пользователей, совпадающими с максимальным номером цикла для этого идентификатора пользователя. В данный момент запрос возвращает один и тот же идентификатор пользователя несколько раз для различных номеров циклов. Мы не совсем уверены, как выполнить правильный запрос. Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 02 февраля 2010

Удалите CycleCurrentStep из вашей группы по предложению.

1 голос
/ 02 февраля 2010
SELECT
    u.UserID, 
    UserLastName, 
    UserFirstName, 
    UserName, 
    Notified, 
    c.CycleNumber, 
    c.CycleCurrentStep, 
    c.CycleDateReported, 
    c.cycleid
FROM
    [User] u 
    INNER JOIN 

    (SELECT 
        u.UserID
        Max(CycleNumber) CycleNumber,
    FROM 
        [User] u 
        left join Cycle c on (u.UserID = c.UserID) 
    GROUP BY
        u.UserID) MaxCycle
    ON u.UserID = MaxCycle.UserId
    INNER JOIN Cycle c
    ON MaxCycle.Cycleumber = c.CycleNumber
1 голос
/ 02 февраля 2010

Это, вероятно, потому что вы группируете по c.CycleCurrentStep. Это неагрегированный столбец из цикла - если для всех строк в Cycle имеется более одного отдельного значения CycleCurrentStep, соответствующего одной строке из User, то вы получите столько же строк для этого пользователя в результат, поскольку есть различные значения для CycleCurrentStep

Вы можете удалить столбец CycleCurrentStep из списка GROUP BY, но затем вам придется удалить его и из списка SELECT - это потому, что вы не можете одновременно агрегировать все соответствующие строки Cycle как группа, а затем выберите неагрегированное значение и сообщите об этом. Поэтому, если вы удаляете CycleCurrentStep из GROUP BY, вы должны либо удалить его из списка SELECT, либо применить к нему значимую функцию aggreagate, как вы это делали с другими столбцами из Cycle, где вы применили MAX() функция.

0 голосов
/ 02 февраля 2010

Вы можете сделать это с помощью подзапроса в предложении where. Что-то вроде:

SELECT u.UserID, UserLastName, UserFirstName, UserName, Notified, 
CycleNumber, CycleCurrentStep, CycleDateReported, cycleid
FROM [User] u 
left join Cycle c on (u.UserID = c.UserID) 
join UserDivSection us on (u.UserID = us.UserID and us.DivSectionID=26) 
where cyclenumber = ( select max(cyclenumber) from cycle where cycle.userid = u.userid)

Я не уверен насчет части UserDivSection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...