Sql 是否在查询中保存select子句的结果以在同一查询中重用?
我想创建一个查询,显示等于特定值的列的计数,但只显示Microsoft SQL Server中此计数正好为2的结果 这就是我到目前为止所做的:Sql 是否在查询中保存select子句的结果以在同一查询中重用?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想创建一个查询,显示等于特定值的列的计数,但只显示Microsoft SQL Server中此计数正好为2的结果 这就是我到目前为止所做的: SELECT Menu.id, ( select count(*) from (values (Menu.item1, Menu.item2, Menu.item3) as v(col) where v.col = 'banana' ) as numBananas FROM Me
SELECT Menu.id,
(
select count(*)
from (values (Menu.item1, Menu.item2, Menu.item3) as v(col)
where v.col = 'banana'
) as numBananas
FROM Menu
WHERE (
select count(*)
from (values (Menu.item1, Menu.item2, Menu.item3) as v(col)
where v.col = 'banana'
) = 2;
有没有办法避免select子句和WHERE子句中多余的select count*语句?我尝试了以下方法,但不起作用:
SELECT Menu.id,
(
select count(*)
from (values (Menu.item1, Menu.item2, Menu.item3) as v(col)
where v.col = 'banana'
) as numBananas
FROM Menu
WHERE
numBananas = 2;
只需添加一个额外的查询级别即可使用任何子查询结果,例如 我还纠正了as vcol的语法错误
除了如图所示使用派生表/外部查询作为Dale之外,还可以使用交叉应用 顺便说一下,您最初的查询vcol不正确。我想应该是这样
from (
values (Menu.item1), (Menu.item2), (Menu.item3)
) as v(col)
或者如果您更喜欢CTE方法
为什么要取消PIVOT?只要做:
select m.*
from menu m
where ((case when m.item1 = 'banana' then 1 else 0 end) +
(case when m.item2 = 'banana' then 1 else 0 end) +
(case when m.item3 = 'banana' then 1 else 0 end)
) = 2;
如果要取消PIVOT,可以使用子查询:
select m.*
from menu m cross apply
(select count(*) as cnt
from (values (m.item1), (m.item2), (m.item3)) v(item)
where item = 'banana'
) x
where cnt = 2;
如果计数不等于2怎么办?结果是什么?@Squirrel如果计数不是2,则不包括该行。所以numBananas应该为每行=2。您有任何样本数据吗?
; with cte as
(
SELECT Menu.id,
(
select count(*)
from (
values (Menu.item1), (Menu.item2), (Menu.item3)
) as v(col)
where v.col = 'banana'
) as numBananas
FROM Menu
)
select *
from cte
WHERE numBananas = 2
select m.*
from menu m
where ((case when m.item1 = 'banana' then 1 else 0 end) +
(case when m.item2 = 'banana' then 1 else 0 end) +
(case when m.item3 = 'banana' then 1 else 0 end)
) = 2;
select m.*
from menu m cross apply
(select count(*) as cnt
from (values (m.item1), (m.item2), (m.item3)) v(item)
where item = 'banana'
) x
where cnt = 2;