Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否在查询中保存select子句的结果以在同一查询中重用?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 是否在查询中保存select子句的结果以在同一查询中重用?

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

我想创建一个查询,显示等于特定值的列的计数,但只显示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 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;