与where子句失败的"子查询返回的值超过1。"

时间:2015-10-19 17:51:20

标签: sql-server

我正在尝试像这样的查询,正在尝试使用data.stackexchange.com并且我收到错误但我无法保存查询,因为它有错误

CREATE TABLE #Stats(EarnedPrem INT, Code varchar(10), Ref INT, ReportPeriod varchar(10));

INSERT INTO #Stats VALUES(100, 'AB', 1111, '201510');
INSERT INTO #Stats VALUES(200, 'AB', 1111, '201510');
INSERT INTO #Stats VALUES(300, 'BC', 1111, '201510');
INSERT INTO #Stats VALUES(100, 'XF', 1111, '201510');
INSERT INTO #Stats VALUES(200, 'AB', 1111, '201510');
INSERT INTO #Stats VALUES(300, 'XF', 1111, '201510');
INSERT INTO #Stats VALUES(500, 'AB', 2222, '201510');
INSERT INTO #Stats VALUES(600, 'AB', 2222, '201510');
INSERT INTO #Stats VALUES(300, 'BC', 2222, '201510');
INSERT INTO #Stats VALUES(900, 'XF', 2222, '201510');
INSERT INTO #Stats VALUES(800, 'AB', 2222, '201510');
INSERT INTO #Stats VALUES(400, 'XF', 2222, '201510');
INSERT INTO #Stats VALUES(100, 'AB', 1111, '201509');
INSERT INTO #Stats VALUES(200, 'AB', 1111, '201509');
INSERT INTO #Stats VALUES(300, 'BC', 1111, '201509');
INSERT INTO #Stats VALUES(100, 'XF', 1111, '201509');
INSERT INTO #Stats VALUES(200, 'AB', 1111, '201509');
INSERT INTO #Stats VALUES(300, 'XF', 1111, '201509');
INSERT INTO #Stats VALUES(500, 'AB', 2222, '201509');
INSERT INTO #Stats VALUES(600, 'AB', 2222, '201509');
INSERT INTO #Stats VALUES(300, 'BC', 2222, '201509');
INSERT INTO #Stats VALUES(900, 'XF', 2222, '201509');
INSERT INTO #Stats VALUES(800, 'AB', 2222, '201509');
INSERT INTO #Stats VALUES(400, 'XF', 2222, '201509');




CREATE TABLE #LossHistory(SystemId INT, Amount INT, ID INT);

INSERT INTO #LossHistory VALUES(1111, 3000, 555);
INSERT INTO #LossHistory VALUES(1111, 4000, 556);
INSERT INTO #LossHistory VALUES(1111, 5000, 557);
INSERT INTO #LossHistory VALUES(2222, 1000, 401);
INSERT INTO #LossHistory VALUES(2222, 2000, 402);
INSERT INTO #LossHistory VALUES(2222, 3000, 403);


SELECT
distinct
lh.SystemId,
lh.ID,
(SELECT SUM(Amount) FROM #LossHistory where SystemId = lh.SystemId) Amount,
(SELECT SUM(ISNULL(pss.EarnedPrem,0)) FROM #Stats where Code = pss.Code and ReportPeriod = pss.ReportPeriod) EarnedPremium,
pss.Code,
pss.ReportPeriod
FROM
#LossHistory lh
left join #Stats pss on lh.SystemId = pss.Ref
WHERE
lh.SystemId in (1111, 2222)
and ReportPeriod = (select MAX (ReportPeriod) from #Stats where Ref = lh.SystemId)
GROUP BY lh.SystemId, lh.ID, pss.Code, pss.ReportPeriod

但是我得到了:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

这是造成这个问题的原因,我相信:

(SELECT SUM(ISNULL(pss.EarnedPrem,0)) FROM #Stats where Code = pss.Code and ReportPeriod = pss.ReportPeriod)

这个SUM很重要,因为对于结果行,我想获得特定报告周期的EarnedPremim的SUM和当前行的代码。

不确定我的工作是否可行?

编辑:

我更改为此查询:

http://data.stackexchange.com/stackoverflow/query/377639/tes22

但是现在,例如,这两者在EarnedPremium colmn(2400)中具有相同的值。我希望这也受到原始Where子句的影响:

WHERE
lh.SystemId in (1111, 2222)
and ReportPeriod = (select MAX (ReportPeriod) from #Stats where Ref = lh.SystemId)

1111 12000 2400 AB 201510

2222 6000 2400 AB 201510

因此,对于1111,它只会将EarnedPremium总计为匹配1111(来自连接)的结果。

2 个答案:

答案 0 :(得分:0)

您可能想要使用:

SELECT SUM(ISNULL(EarnedPrem,0))

而不是

SELECT SUM(ISNULL(pss.EarnedPrem,0))

否则选择不会产生太大的影响

答案 1 :(得分:0)

也许这会有所帮助;我补充说:

SELECT
distinct
lh.SystemId,
lh.ID,
(SELECT SUM(Amount) FROM #LossHistory where SystemId = lh.SystemId) Amount,
ISNULL(sumearned.EarnedPrem,0) as EarnedPremium,
ISNULL(sumearned.Code,'') as Code,
maxperiod.ReportPeriod
FROM
#LossHistory lh
join (select MAX(ReportPeriod) ReportPeriod, Ref from #Stats Group by Ref) as maxperiod on lh.SystemId = maxperiod.Ref
left join (select SUM(EarnedPrem) as EarnedPrem, Code, ReportPeriod, Ref from #Stats Group by Code, ReportPeriod, Ref) as sumearned on maxperiod.ReportPeriod = sumearned.ReportPeriod and lh.SystemId = sumearned.Ref
WHERE
lh.SystemId in (1111, 2222)
--GROUP BY lh.SystemId, lh.ID, sumearned.Code, maxperiod.ReportPeriod