为总计创建附加列并包含在WHERE子句中

时间:2016-01-15 13:23:10

标签: sql sql-server sql-server-2008 where-clause

我正在使用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

2 个答案:

答案 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;}