VinnarenMedlem sedan sep. 2005833 inlägg Hej!
Har följande:
SELECT DISTINCT u.UserName, ISNULL(ual.Status, 10) AS Status,
ISNULL(ual.ActiveDate, ISNULL(lg.CreateDate, '1970-01-01 00:00:00')) AS LastActive,
r.RoleName, ISNULL(ui.Avatar, ''), ISNULL(lg.Action, ''), ISNULL(at.Message, '')
FROM aspnet_Users AS u
INNER JOIN aspnet_UsersInRoles AS uir
ON uir.UserId = u.UserId
LEFT OUTER JOIN UserInfo AS ui
ON u.UserName = ui.UserName
LEFT OUTER JOIN UserActLog AS ual
ON ual.UserName = u.UserName
LEFT OUTER JOIN UserLog AS lg
ON lg.UserName = u.UserName
INNER JOIN ActionType AS at
ON at.Type = lg.Type
INNER JOIN aspnet_Roles AS r
ON r.RoleId = uir.RoleId
INNER JOIN aspnet_Membership as m
ON m.UserId = u.UserId
WHERE
(u.UserName LIKE '%'+@UserName+'%' OR @UserName = '') AND
(ISNULL(ual.ActiveDate, ISNULL(lg.CreateDate, '1970-01-01 00:00:00')) >= @LastActive or YEAR(@LastActive) = 1970) AND
(r.RoleName = @RoleName OR @RoleName = '')
ORDER BY u.UserName ASC
Jag vill enbart ha ut samma användarnamn(u.UserName) en gång. Som det är nu kommer det flera gånger. Det är kolumnerna lg.Action samt at.Message som 'ställer' till det.
Hur ska jag få det att det enbart visas en gång? Anv MSSQL.
Tacksam för all hjälp :stud
SPiNMedlem sedan mars 20007 896 inlägg ...
group by
u.UserName
order by
u.UserName asc
VinnarenMedlem sedan sep. 2005833 inlägg Tack, har redan provat detta, och får felmeddelandet "Column ual.Status is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ORDER BY items must appear in the select list if SELECT DISTINCT is specified".
Skulle iof gå att slå ihop de två sista kolumnerna, o sen splita de i koden, men är nog inte så optimalt, måste ju finnas nån lösning på det hela? :q
Peter SMedlem sedan dec. 20025 483 inlägg Eftersom du får flera Action och Message för varje användare så måste du bestämma vilken Action och Message du vill visa; är det det senaste Action resp. Message, eller spelar det kanske ingen roll? Om det inte spelar någon roll så behöver du ju inte ta med dessa kolumner i select-listan.
VinnarenMedlem sedan sep. 2005833 inlägg Ja, det är den senaste lg.Action som jag vill ha ut, at.Message är typnamnet till lg.Action. :stud
Gör en subselect vetja! :)
VinnarenMedlem sedan sep. 2005833 inlägg mjo, har funderat på det. Men den kan enbart returnera ett värde? Vill ju ha ut både at.Message och lg.Action.
Visst är det så och därför gör du två subselects! :)
VinnarenMedlem sedan sep. 2005833 inlägg Är det bättre än o slå ihop två kolumner till en, o sen köra split på dessa för att få ut bägge? :i :q (prestandamässigt )
Krångla inte till det! ;)
http://en.wikipedia.org/wiki/KISS_principle
Ett alternativ annars är att göra en speciell vy i MS SQL som hämtar exakt det du vill hämta.
När man är inne på optimering så är det lätt att börja i fel ände, två subselects är i regel inget prestandaproblem.
VinnarenMedlem sedan sep. 2005833 inlägg Haha, jo, det har du nog rätt i. Tack, får köra på det ;)
Ett annat litet problem jag har med samma sql fråga är TOP. Jag skickar in hur många rader jag vill ha från SP. Men hur skriver jag detta?
Har provat med:
SELECT DISTINCT TOP @Unit u.UserName .....
Men får felmeddelandet "incorrect syntax near '@Unit'"
:r
VinnarenMedlem sedan sep. 2005833 inlägg aha, givetvis, tack :bire