子查询有多个记录

时间:2012-02-29 06:18:08

标签: sql sql-server sql-server-2008

我有两张表格如下:

tbl_test

OFID bigint
Offer_Text text

OFID    Offer_Text   
-------    ----------    
1014    Test1   
1015    Test2

tbl_trans

OfferNo nvarchar        

OfferNo       
---------    
1015    
1015   
1015   
1014

现在,我想要一个o / p,如下所示

OFID    Offer_Text  Counter    
-------    -------------  -------  
1014    Test1       1   
1015    Test2       3

这意味着每个OFID的计数也包含Offer_Text ..

有可能吗??

对此有什么正确的查询?

我的现有查询是:

SELECT 
   offer_Text, OFID, COUNT(OFID) as Counter 
FROM 
    tbl_Test as a, tbl_trans as b 
WHERE 
    cast(a.OFID as nvarchar) = b.OfferNo 
GROUP BY 
    a.OFID

但是给我以下错误:

  

列'tbl_Offer.Offer_Text'在选择列表中无效,因为它   不包含在聚合函数或GROUP BY中   子句。

3 个答案:

答案 0 :(得分:3)

不确定

SELECT 
   OFID, Offer_Text,
   Counter = (SELECT COUNT(*) 
              FROM dbo.tbl_trans t
              WHERE t.OfferNo = CAST(OFID AS NVARCHAR(30)))
FROM
   dbo.tbl_test 

为您提供所需的输出:

OFID  OfferText  Counter
1014  Test1        1
1015  Test2        3

更新:只包含tbl_trans子表中存在的那些行(新要求 - 原始问题中没有!),您需要这样的内容:

SELECT 
   OFID, Offer_Text,
   Counter = (SELECT COUNT(*) 
              FROM dbo.tbl_trans t
              WHERE t.OfferNo = CAST(OFID AS NVARCHAR(30)))
FROM
   dbo.tbl_test 
WHERE 
   EXISTS (SELECT * FROM dbo.tbl_trans WHERE t.OfferNo = OFID)

答案 1 :(得分:1)

SELECT 
   OFID, Offer_Text,
   (SELECT COUNT(*) FROM tbl_trans t2
    WHERE CAST(t1.OFID as nvarchar) = t2.OfferNo) AS Counter
FROM
   tbl_test t1

答案 2 :(得分:0)

如果测试中的ofid与trans表中的任何一个不匹配,这也会重新结果:

select te.*, count(tr.offerno) as counter from tbl_test te
left join tbl_trans tr
on te.ofid = tr.offerno
group by te.ofid, te.offer_text

例如,如果测试表中有1016,则返回:

OFID    Offer_Text  Counter    
-------------------------- 
1014    Test1       1  
1015    Test2       3
1016    Test3       0

如果1016不在那里,只需从查询中删除left这个词:)

注意:测试了联接,无论数据类型有何不同,它都应该有效