子查询是具有多于一个的记录
我有如下两个表:子查询是具有多于一个的记录
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.
肯定的:
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)
是的..你几乎在那里......但是这给了我tbl_test所有记录与0计数器不匹配。 但我只想要那些与tbl_trans表中的OfferNo相匹配的记录。 – 2012-02-29 07:02:03
@VishalSuthar:这是一个**新要求**,这在您的原始问题中没有!我已经用一种解决方案更新了我的答案。 – 2012-02-29 12:18:21
非常棒..你真棒.. – 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
注:测试的加盟,无论它应该工作数据类型的区别
那么只有在表列中的所有值转换都没有错误的情况下,连接才会起作用。否则,该声明将错误。 – 2012-02-29 06:47:47
好点。我从样本数据中假定它就是这样 – 2012-02-29 06:51:07
两个旁注:**为什么**是'OFID'是'BIGINT',但另一个表中的'OfferNo'是'NVARCHAR'?这是同样的事情 - 没有?也应该是相同的数据类型!同样:不再使用'TEXT' - 它已被弃用。改为使用'VARCHAR(MAX)'或'NVARCHAR(MAX)'。 – 2012-02-29 06:36:35