2013-09-09 4 views
0

У меня есть этот запрос ниже, связанный с моим PHP-скриптом ранжирования кланов.Как отредактировать этот запрос mssql?

SELECT TOP 100 
    IDNum, 
    IDName, 
    Nation, 
    (SELECT SUM(LoyaltyPoint) 
    FROM USERDATA 
    WHERE USERDATA.Knights = KNIGHTS.IDNum 
    AND USERDATA.Authority IN(1, 2)) as ClanLoyalty 
FROM KNIGHTS 
ORDER BY ClanLoyalty DESC 

Я хочу добавить второе правило для MannerPoint в качестве дополнительного к лояльности. Таким образом, он отобразит как точки поиска, так и точки лояльности и закажет их обоими.

Например, если у клана 10000 лояльности и 100 очков, он будет выше в рейтингах, чем 20000 Loyalty и только 50 Manner.

Я пробовал несколько, но не смог. Будет очень признателен, если кто-то захочет помочь мне.

EDIT: Я пытался что: SELECT TOP 100 IDNum, IDName, Nation, (SELECT SUM(LoyaltyPoint) FROM USERDATA WHERE USERDATA.Knights = KNIGHTS.IDNum AND USERDATA.Authority IN(1, 2)) as ClanLoyalty, (SELECT SUM(MannerPoint) FROM USERDATA WHERE USERDATA.Knights = KNIGHTS.IDNum AND USERDATA.Authority IN(1, 2))) as MannerPoint FROM KNIGHTS ORDER BY ClanLoyalty DESC, MannerPoint DESC

но оно не отображаться.

+0

для начала вам необходимо указать, где точки Manner хранятся – DevZer0

+0

Они находятся в USERDATA же, как и Верности точки. – nRov

+0

в вашем основном заявлении выбора, добавьте еще один столбец возврата для точки поиска и включите его в свой заказ. Например, например, Выберите [существующая колонна], (выберите способ) как MannerPoint от ... где ... заказать по MannerPoint desc, ClanLoyalty DESC – Ashish

ответ

0

Вы можете суммировать как LoyaltyPoint и MannerPoint, используя внешний применять:

select top 100 
    k.IDNum, 
    k.IDName, 
    k.Nation, 
    u.ClanLoyalty, 
    u.ClanManner 
from KNIGHTS as k 
    outer apply (
     select 
      sum(u.LoyaltyPoint) as ClanLoyalty, 
      sum(u.MannerPoint) as ClanManner 
     from USERDATA as u 
     where u.Knights = k.IDNum and u.Authority in (1, 2) 
    ) as u 
order by u.ClanManner desc, u.ClanLoyalty desc 

или простой подзапрос:

select top 100 
    k.IDNum, 
    k.IDName, 
    k.Nation, 
    u.ClanLoyalty, 
    u.ClanManner 
from KNIGHTS as k 
    left outer join (
     select 
      u.Knights, 
      sum(u.LoyaltyPoint) as ClanLoyalty, 
      sum(u.MannerPoint) as ClanManner 
     from USERDATA as u 
     where u.Authority in (1, 2) 
     group by u.Knights 
    ) as u on u.Knights = k.IDNum 
order by u.ClanManner desc, u.ClanLoyalty desc 

Не знаю, как вы хотите заказать ваши записи, если вы хотите по сумме ClanManner и ClanLoyalty, вы можете сделать это:

order by isnull(u.ClanManner, 0) + isnull(u.ClanLoyalty, 0) desc 
0

это:

SELECT TOP 100 
IDNum, IDName, Nation, 
    (SELECT SUM(LoyaltyPoint) 
    FROM USERDATA 
    WHERE USERDATA.Knights = KNIGHTS.IDNum 
      AND USERDATA.Authority IN(1, 2)) as ClanLoyalty, 
    (SELECT SUM(MannerPoint) 
    FROM USERDATA 
    WHERE USERDATA.Knights = KNIGHTS.IDNum 
      AND USERDATA.Authority IN(1, 2))) as MannerPoint 
FROM KNIGHTS 
ORDER BY ClanLoyalty DESC, MannerPoint DESC` 

имеет вопрос о синтаксической дополнительной скобкой в ​​нем и должно быть:

SELECT TOP 100 
IDNum, IDName, Nation, 
    (SELECT SUM(LoyaltyPoint) 
    FROM USERDATA 
    WHERE USERDATA.Knights = KNIGHTS.IDNum 
      AND USERDATA.Authority IN(1, 2)) as ClanLoyalty, 
    (SELECT SUM(MannerPoint) 
    FROM USERDATA 
    WHERE USERDATA.Knights = KNIGHTS.IDNum 
      AND USERDATA.Authority IN(1, 2)) as MannerPoint 
FROM KNIGHTS 
ORDER BY ClanLoyalty DESC, MannerPoint DESC`