我正在使用SQL Server 2008并编写了查询:
SELECT
RTRIM(BLDGCODE) AS BLDGCODE,
RTRIM(FLOORCODE) AS FLOORCODE,
SUM(CASE WHEN rtrim(spacetype) LIKE '%fs' THEN 1 ELSE 0 END) AS FLR_SHARED,
SUM(CASE WHEN rtrim(spacetype) LIKE '%bs' THEN 1 ELSE 0 END) AS BLDG_SHARED,
SUM(CASE WHEN rtrim(spacetype) LIKE '%as' AND rtrim(spacetype) NOT IN ('U-TLS-AS', 'U-PARK-AS') THEN 1 ELSE 0 END) AS FLR_ASSIGNABLE,
SUM(CASE WHEN rtrim(spacetype) = 'U-TLS-AS' THEN 1 ELSE 0 END) AS TENANT
FROM FMA0
WHERE
bldgcode in ('us0385', 'us0566')
GROUP BY BLDGCODE, FLOORCODE
ORDER BY BLDGCODE, FLOORCODE
返回结果:
BLDGCODE FLOORCODE FLR_SHARED BLDG_SHARED FLR_ASSIGNABLE TENANT
US0385 01-T 0 0 3 1
US0385 02-T 10 0 28 0
US0385 03-T 27 0 404 0
US0385 04-T 83 0 251 0
US0385 05-T 75 0 132 0
US0385 06-T 85 0 191 0
US0385 07-T 73 0 210 0
US0385 08-T 60 1 250 0
US0385 09-T 29 0 270 0
US0385 10-T 22 0 385 0
US0385 11-T 8 23 0 0
US0385 CELL-01 11 5 59 0
US0385 CELL-02 8 3 49 0
US0385 CELL-03 0 3 0 0
US0385 CELL-T 32 0 114 0
US0566 1 0 7 0 3
US0566 2 0 0 0 2
US0566 3 0 0 0 2
US0566 4 0 0 0 2
US0566 LG 4 3 0 4
这很好但是我需要一个额外的列,其中包含每个 BLDGCODE 的 FLR_ASSIGNABLE 的总和,所以从上面的示例数据中我应该看到:
BLDGCODE FLOORCODE FLR_SHARED BLDG_SHARED FLR_ASSIGNABLE BLDG_ASSIGNABLE TENANT
US0385 01-T 0 0 3 2346 1
US0385 02-T 10 0 28 2346 0
US0385 03-T 27 0 404 2346 0
US0385 04-T 83 0 251 2346 0
US0385 05-T 75 0 132 2346 0
US0385 06-T 85 0 191 2346 0
US0385 07-T 73 0 210 2346 0
US0385 08-T 60 1 250 2346 0
US0385 09-T 29 0 270 2346 0
US0385 10-T 22 0 385 2346 0
US0385 11-T 8 23 0 2346 0
US0385 CELL-01 11 5 59 2346 0
US0385 CELL-02 8 3 49 2346 0
US0385 CELL-03 0 3 0 2346 0
US0385 CELL-T 32 0 114 2346 0
US0566 1 0 7 0 0 3
US0566 2 0 0 0 0 2
US0566 3 0 0 0 0 2
US0566 4 0 0 0 0 2
US0566 LG 4 3 0 0 4
此外,是否可以过滤掉结果
Where FLR_SHARED > 0 AND FLR_ASSIGNABLE = 0
OR
Where BLDG_SHARED > 0 AND BLDG_ASSIGNABLE = 0
所以我只得到
BLDGCODE FLOORCODE FLR_SHARED BLDG_SHARED FLR_ASSIGNABLE BLDG_ASSIGNABLE TENANT
US0385 11-T 8 23 0 2346 0
US0566 1 0 7 0 0 3
US0566 LG 4 3 0 0 4
答案 0 :(得分:2)
嗯,我认为你可以做这样的结构:
with cte as (
<your query here>
)
select cte.*
from (select cte.*,
sum(bldg_assignable) over (partition by BLDGCODE) as bldg_sum
from cte
) cte
where FLR_SHARED > 0 AND FLR_ASSIGNABLE = 0 and
BLDG_SHARED > 0 AND bldg_sum = 0;
关键思想是在一个级别(在子查询或CTE中)使用窗口函数。然后在外部查询中过滤。
答案 1 :(得分:0)
我认为这是您正在寻找的查询:
.btn {z-index: 1}
.btn:before {z-index: -1;}