为总计创建附加列并包含在 WHERE 子句中
Create additional column for totals and include in 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
其中returns结果:
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
或
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
嗯,我想你可以用这样的结构做你想做的事:
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 中)使用 window 函数。然后在外部查询中过滤。
我认为这是您要查找的查询:
WITH CTE
AS
(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
)
SELECT CTE.*, SUM(FLR_ASSIGNABLE) AS BLDG_ASSIGNABLE FROM CTE
where (FLR_SHARED > 0 AND FLR_ASSIGNABLE = 0) or
(BLDG_SHARED > 0 AND SUM(FLR_ASSIGNABLE) = 0)
我正在使用 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
其中returns结果:
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
或
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
嗯,我想你可以用这样的结构做你想做的事:
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 中)使用 window 函数。然后在外部查询中过滤。
我认为这是您要查找的查询:
WITH CTE
AS
(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
)
SELECT CTE.*, SUM(FLR_ASSIGNABLE) AS BLDG_ASSIGNABLE FROM CTE
where (FLR_SHARED > 0 AND FLR_ASSIGNABLE = 0) or
(BLDG_SHARED > 0 AND SUM(FLR_ASSIGNABLE) = 0)