具有多个WHERE子句的SQL秩

具有多个WHERE子句的SQL秩,sql,tsql,select,Sql,Tsql,Select,我有几个销售办事处,还有他们的销售部。我试图建立一个报告,基本上可以告诉你每个办公室的表现如何。得到一些总数,计数是相当容易的,但我正在努力获得单办公室的排名 我希望此查询返回整个期间和/或指定时间内单个办公室的排名(例如,在“2015-01-01”和“2015-01-15”之间) 我还需要从排名列表中排除一些办公室(例如OfficeName不在('GGG','QQQ')),因此使用示例数据,办公室'XYZ'的排名将为5 如果OfficeName='XYZ'包含在WHERE子句中,则在执行其余代

我有几个销售办事处,还有他们的销售部。我试图建立一个报告,基本上可以告诉你每个办公室的表现如何。得到一些总数,计数是相当容易的,但我正在努力获得单办公室的排名

我希望此查询返回整个期间和/或指定时间内单个办公室的排名(例如,在“2015-01-01”和“2015-01-15”之间)

我还需要从排名列表中排除一些办公室(例如OfficeName不在('GGG','QQQ')),因此使用示例数据,办公室'XYZ'的排名将为5

如果OfficeName='XYZ'包含在WHERE子句中,则在执行其余代码之前,由于SQL过滤掉了WHERE子句中未包含的其他行,因此排名显然将为=1。 有没有办法不使用临时表也能做到这一点

SELECT OfficeName, SUM(Value) as SUM,
RANK() OVER (ORDER BY SUM(VALUE) DESC) AS Rank

FROM Transactions t
JOIN Office o ON t.TransID=o.ID

WHERE OfficeName NOT IN ('GGG','QQQ')
--AND OfficeName = 'XYZ' 

GROUP BY OfficeName

ORDER BY 2 DESC; 
我正在使用MS SQL server 2008

SQL摆弄一些随机数据如下:


非常感谢你的帮助

如果我正确理解您的意思,您希望:

SELECT * 
FROM (
  SELECT OfficeName, SUM(Value) as SUM,
    RANK() OVER (ORDER BY SUM(VALUE) DESC) AS Rank    
  FROM Transactions t
  JOIN Office o ON t.TransID=o.ID
  WHERE OfficeName NOT IN ('GGG','QQQ')
  GROUP BY OfficeName
) dat
WHERE OfficeName = 'XYZ'; 

您只需要将代码包装为派生表,或者像这样使用
CTE
,然后对
OfficeName='XYZ'
进行筛选

;WITH CTE AS 
(
SELECT OfficeName, SUM(Value) as SUM,
RANK() OVER (ORDER BY SUM(VALUE) DESC) AS Rank
FROM Transactions t
JOIN Office o ON t.TransID=o.ID
WHERE OfficeName NOT IN ('GGG','QQQ')
GROUP BY OfficeName
)
SELECT * 
FROM CTE
WHERE OfficeName = 'XYZ';

下面是一种不用子查询即可完成此操作的有趣方法:

SELECT TOP 1 OfficeName, SUM(Value) as SUM,
       RANK() OVER (ORDER BY SUM(VALUE) DESC) AS Rank
FROM Transactions t JOIN
     Office o
     ON t.TransID = o.ID
WHERE OfficeName NOT IN ('GGG','QQQ')
GROUP BY OfficeName
ORDER BY (CASE WHEN OfficeName = 'XYZ' THEN 1 ELSE 2 END);

显示预期结果:我很困惑。我不知道你想做什么。每个办事处都按销售额列出和排名。。。唯一缺少的是日期,但您没有提供日期的结构。。。