子查询是具有多于一个的记录

问题描述:

我有如下两个表:子查询是具有多于一个的记录

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 

但给我下面的错误:

Column 'tbl_Offer.Offer_Text' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

+2

两个旁注:**为什么**是'OFID'是'BIGINT',但另一个表中的'OfferNo'是'NVARCHAR'?这是同样的事情 - 没有?也应该是相同的数据类型!同样:不再使用'TEXT' - 它已被弃用。改为使用'VARCHAR(MAX)'或'NVARCHAR(MAX)'。 – 2012-02-29 06:36:35

肯定的:

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) 
+0

是的..你几乎在那里......但是这给了我tbl_test所有记录与0计数器不匹配。 但我只想要那些与tbl_trans表中的OfferNo相匹配的记录。 – 2012-02-29 07:02:03

+0

@VishalSuthar:这是一个**新要求**,这在您的原始问题中没有!我已经用一种解决方案更新了我的答案。 – 2012-02-29 12:18:21

+1

非常棒..你真棒.. – 2012-03-01 12:23:23

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

这将也reeturn结果那里是测试不匹配agains任何在跨表OFID:

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

注:测试的加盟,无论它应该工作数据类型的区别

+1

那么只有在表列中的所有值转换都没有错误的情况下,连接才会起作用。否则,该声明将错误。 – 2012-02-29 06:47:47

+0

好点。我从样本数据中假定它就是这样 – 2012-02-29 06:51:07