如何在 SQL Server 中子查询的 WHERE 子句中分配变量

How to assign a variable in the WHERE clause of a sub-query in SQL Server

提问人:Sadia 提问时间:12/4/2017 最后编辑:marc_sSadia 更新时间:12/8/2017 访问量:1621

问:

SELECT 
    Total_Males, SETTLEMENT_ID, URI, _PARENT_AURI    
FROM
    (SELECT 
         COUNT(t2.SEX) as Total_Males, t1.SETTLEMENT_ID, t1.URI, 
         t2._PARENT_AURI 
     FROM 
         PScData t1 
     INNER JOIN 
         PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
     WHERE 
         t1.SETTLEMENT_ID = '11102002002001' 
         AND t2.SEX = '1'
     GROUP BY 
         t1.URI, t2._PARENT_AURI, t1.SETTLEMENT_ID) tmp

这是我写的查询。在子句中,我给出了确切的值 - '11102002002001' - 我想与 .我该怎么做?请提供一些解决方案。WHERESETTLEMENT_IDt1

此外,查询在两行中返回计数,即:现在针对两个不同的 ID 进行计数。如何将两个不同 id 的结果相加,得到子查询返回的这两行的总和?

SQL 服务器

评论

0赞 jarlh 12/4/2017
您使用的是 MySQL 还是 MS SQL Server?
0赞 Sadia 12/4/2017
我正在使用 SQL Server
0赞 Bharadwaj 12/4/2017
这是完整的查询吗?因为我认为外部声明是没有必要的。where 子句会将列中的每个值与要过滤的数据进行比较。select

答:

1赞 Shammas 12/4/2017 #1

您的意思是要与表 PScData 中的每个Settlement_id进行比较吗?

根据我对这个问题的理解,您可以在表 PScData 上进行自联接或使用以下查询。

此查询会将settlement_id与同一表中的所有settlement_ids进行比较。我不明白你为什么要这样做。

请检查脚本,如果我弄错了,请告诉我。

SELECT 
        SUM(Total_Males) [Total_males],  SETTLEMENT_ID,URI, _PARENT_AURI    
    FROM
        (SELECT 
             COUNT(t2.SEX) as Total_Males, t1.SETTLEMENT_ID, t1.URI, 
             t2._PARENT_AURI 
         FROM 
             PScData t1 
         INNER JOIN 
             PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
         WHERE 
             t1.SETTLEMENT_ID in (SELECT DISTINCT SETTLEMENT_ID FROM PScData)
             AND t2.SEX = '1'
         GROUP BY 
             t1.URI, t2._PARENT_AURI, t1.SETTLEMENT_ID) tmp
group by
     SETTLEMENT_ID,URI, _PARENT_AURI

评论

1赞 Sadia 12/4/2017
是的,你的答案是正确的。也可以在 where 子句“ t1 中这样完成。SETTLEMENT_ID = SETTLEMENT_ID 和 t2.性别 = '1' “ .我刚刚找到了 .please help for second part ,即:如何对通过 count .thanks 检索到的值求和
0赞 Shammas 12/4/2017
感谢您的评论萨迪亚。如果脚本对您有所帮助,您可能会接受此答案。再次感谢您的点赞。
0赞 Shammas 12/4/2017
让我知道您想获得总和的领域?
0赞 Sadia 12/4/2017
在查询 COUNT(t2.) 给出多个值,因为不同的 id,我想将 Count(t2.) 结果值添加到 1 个答案中
0赞 Shammas 12/4/2017
您按Settlement_ID分组,这是它显示基于结算 ID 的计数的原因。 如果您从 SELECT 列表和 GROUP BY 中删除settlement_id,您将收到总计数。
1赞 Bozhidar Stoyneff 12/4/2017 #2

子查询在这里无效。如果您不需要所有定居点,只需执行连接并过滤掉定居点。但是从您的问题中不清楚您是要过滤掉它们还是只是匹配它们。为了匹配,使用联接。

SELECT COUNT(t2.SEX) as Total_Males, t1.SETTLEMENT_ID, t1.URI, t2._PARENT_AURI 
FROM PScData t1 
    INNER JOIN PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
WHERE t2.SEX = '1'
GROUP BY t1.URI, t2._PARENT_AURI, t1.SETTLEMENT_ID

如果您需要过滤掉它们,您需要准备想要的和解清单并在条款中使用。您可以使用公共表表达式来展开想要的结算列表,并将其传递到子句中:INWHEREWHERE

WITH cteSettlements AS (
    SELECT SETLLEMENT_ID
    FROM PscData
    WHERE ? -- apply some criteria
)
SELECT COUNT(t2.SEX) as Total_Males, t1.SETTLEMENT_ID, t1.URI, t2._PARENT_AURI 
FROM PScData t1 
    INNER JOIN PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
WHERE t1.SETTLEMENT_ID IN cteSettlements AND t2.SEX = '1'
GROUP BY t1.URI, t2._PARENT_AURI, t1.SETTLEMENT_ID

至于第二个问题 - 如何将两个不同 ID 的结果相加以获得这两行的总和?- 你需要玩这个子句。据我了解,您实际上不需要分组,因此只需将其从 .请记住,您也需要将其从列表中删除。GROUP BYSETTLEMENT_IDGROUP BYSELECT

1赞 Sadia 12/4/2017 #3

我找到了查询的解决方案,结果可以检索并总结如下:

SELECT Total_Males, SETTLEMENT_ID
FROM (
    SELECT COUNT(t2.SEX) as Total_Males, t1.SETTLEMENT_ID 
    FROM PScData t1  
        INNER JOIN PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
    WHERE t1.SETTLEMENT_ID in (SELECT DISTINCT SETTLEMENT_ID FROM PScData)
      AND t2.SEX = '1'
    GROUP BY t1.SETTLEMENT_ID
) tmp

评论

0赞 Shammas 12/4/2017
嗨,萨迪亚。感谢分享这个答案。一旦我的投票余额更新,我肯定会尽快对此投赞成票。
0赞 Bozhidar Stoyneff 12/8/2017
同样,子查询是无效的。实际上,在本例中,外部查询是无效的。只需执行子查询即可获得相同的结果。
1赞 Damini Suthar 12/4/2017 #4

尝试使用 ,

Select 
Total_Males, SETTLEMENT_ID , URI, _PARENT_AURI    
from
(Select 
COUNT(t2.SEX) as Total_Males ,t1.SETTLEMENT_ID  , t1.URI, t2._PARENT_AURI    
from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
 where
  t1.SETTLEMENT_ID in (SELECT DISTINCT SETTLEMENT_ID FROM PScData)
  AND t2.SEX = '1'
 Group By 
t1.SETTLEMENT_ID ) tmp