【问题标题】:How to edit this mssql query?如何编辑这个 mssql 查询?
【发布时间】:2013-09-12 18:45:50
【问题描述】:

下面这个查询与我的氏族排名 php 脚本相关联。

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忠诚度和50礼仪。

我尝试了一些但失败了。如果有人愿意帮助我,将不胜感激。

编辑:我试过了: 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

但它根本不显示。

【问题讨论】:

  • 对于初学者,您需要指定存储方式点的位置
  • 它们在 USERDATA 中与忠诚度积分相同。
  • 在您的主选择语句中,为方式点添加另一个返回列并将其包含在您的订单中。例如,选择 [existingColumn],(选择方式)作为 MannerPoint from ... where .. . order by MannerPoint desc, ClanLoyalty 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 FROM USERDATA WHERE USERDATA.Knights = KNIGHTS.IDNum AND USERDATA.Authority IN(1, 2))) as MannerPoint FROM KNIGHTS ORDER BY ClanLoyalty DESC, MannerPoint DESC 喜欢吗?这完全正确吗?
  • 是的,没错

标签: php sql sql-server


【解决方案1】:

您可以使用外部应用对LoyaltyPointMannerPoint 求和:

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

【讨论】:

    【解决方案2】:

    这个:

    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`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 2015-11-15
      • 2021-03-18
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多