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

时间:2017-12-04 09:39:48

标签: sql sql-server

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

这是我写的查询。在WHERE条款中,我已经给出了确切的值 - ' 11102002002001' - 我想与SETTLEMENT_ID中的每个t1进行比较。我怎样才能做到这一点?请提供一些解决方案。

此外,查询返回两行计数,即:现在计算两个不同的ID。如何添加两个不同id的结果来获取子查询返回的这两行的总和?

4 个答案:

答案 0 :(得分:1)

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

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

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

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

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 :(得分:1)

此处的子查询无效。如果您不需要全部,只需执行连接并过滤出结算。但是你的问题并不清楚你是想过滤它们还是只是匹配它们。用于匹配使用连接的目的。

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

如果您需要将其过滤掉,则需要准备好的和解清单,并在IN子句中使用WHERE。您可以使用Common Table Expression展开想要的和解清单,并将其传递给WHERE条款:

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 BY子句。据我了解,您实际上不需要对SETTLEMENT_ID进行分组,因此只需将其从GROUP BY中删除即可。请记住,您也需要将其从SELECT列表中删除。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

试试,

b