具有多个WHERE子句的SQL秩
我有几个销售办事处,还有他们的销售部。我试图建立一个报告,基本上可以告诉你每个办公室的表现如何。得到一些总数,计数是相当容易的,但我正在努力获得单办公室的排名 我希望此查询返回整个期间和/或指定时间内单个办公室的排名(例如,在“2015-01-01”和“2015-01-15”之间) 我还需要从排名列表中排除一些办公室(例如OfficeName不在('GGG','QQQ')),因此使用示例数据,办公室'XYZ'的排名将为5 如果OfficeName='XYZ'包含在WHERE子句中,则在执行其余代码之前,由于SQL过滤掉了WHERE子句中未包含的其他行,因此排名显然将为=1。 有没有办法不使用临时表也能做到这一点具有多个WHERE子句的SQL秩,sql,tsql,select,Sql,Tsql,Select,我有几个销售办事处,还有他们的销售部。我试图建立一个报告,基本上可以告诉你每个办公室的表现如何。得到一些总数,计数是相当容易的,但我正在努力获得单办公室的排名 我希望此查询返回整个期间和/或指定时间内单个办公室的排名(例如,在“2015-01-01”和“2015-01-15”之间) 我还需要从排名列表中排除一些办公室(例如OfficeName不在('GGG','QQQ')),因此使用示例数据,办公室'XYZ'的排名将为5 如果OfficeName='XYZ'包含在WHERE子句中,则在执行其余代
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);
显示预期结果:我很困惑。我不知道你想做什么。每个办事处都按销售额列出和排名。。。唯一缺少的是日期,但您没有提供日期的结构。。。