Sql 错误:当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式
我有下面的查询,它给了我一个错误,当子查询没有引入EXISTS时,只能在select列表中指定一个表达式。我不知道这在技术上有什么问题Sql 错误:当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式,sql,sql-server,Sql,Sql Server,我有下面的查询,它给了我一个错误,当子查询没有引入EXISTS时,只能在select列表中指定一个表达式。我不知道这在技术上有什么问题 select clinicid, DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )) as YEAR, DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )) as MONTH, REPLACE(RIGHT(
select clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )) as YEAR,
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )) as MONTH,
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-') AS SalMonYY,
(select rpTotal.clinicid,SUM(rpTotal.rpPackage) as rpPackage from
(
select clinicid, count(1) as rpPackage
from PackagePatients
WHERE PackagePatients.clinicid = clinicid
AND convert(date,patientdate) < convert(date,saledate)
group by clinicid
union all
select s.homeClinicId as clinicid,COUNT(1) as rpPackage
from subscriptionHistory s
join patients p on s.ptientId = p.id
join products pl on s.productId = pl.id
WHERE s.HomeClinicId = clinicid
and pl.expDuration > 1
group by s.homeClinicId) rpTotal group by rpTotal.clinicid) AS rpPackagesSold
from PackagePatients
group by clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )),
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )),
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-')
没有什么可处理的,我想你可以按照这些思路重新做一下。这应该很接近。至少它会向你展示一种使这项工作成功的方法。老实说,它可能需要完全重写。我没有表之类的东西,但我确信这完全可以在没有子查询的情况下完成
select clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )) as YEAR,
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )) as MONTH,
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-') AS SalMonYY,
rp.rpPackagesSold
from PackagePatients
join
(select SUM(rpTotal.rpPackage) as rpPackagesSold, clinicid
from
(
select clinicid, count(1) as rpPackage
from PackagePatients
WHERE PackagePatients.clinicid = clinicid
AND convert(date,patientdate) < convert(date,saledate)
group by clinicid
union all
select s.homeClinicId as clinicid,COUNT(1) as rpPackage
from subscriptionHistory s
join patients p on s.ptientId = p.id
join products pl on s.productId = pl.id
WHERE s.HomeClinicId = clinicid
and pl.expDuration > 1
group by s.homeClinicId) rpTotal group by rpTotal.clinicid
) AS rp on rp.clinicid = PackagePatients.clinicid
group by clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )),
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )),
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-')
您需要将派生表移动到from子句,如下所示:
select clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )) as YEAR,
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )) as MONTH,
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-') AS SalMonYY,
SUM(rpPackagesSold.rpPackage) AS rpTotal
from PackagePatients
join
(
select clinicid, count(1) as rpPackage
from PackagePatients
WHERE PackagePatients.clinicid = clinicid
AND convert(date,patientdate) < convert(date,saledate)
group by clinicid
union all
select s.homeClinicId as clinicid,COUNT(1) as rpPackage
from subscriptionHistory s
join patients p on s.ptientId = p.id
join products pl on s.productId = pl.id
WHERE s.HomeClinicId = clinicid
and pl.expDuration > 1
group by s.homeClinicId
) rpPackagesSold ON (rpPackagesSold.clinicid = PackagePatients.clinicid)
group by clinicid,
DATEPART(YEAR,CONVERT(date,PackagePatients.SaleDate )),
DATEPART(MONTH,CONVERT(date,PackagePatients.SaleDate )),
REPLACE(RIGHT(CONVERT(VARCHAR(9),PackagePatients.SaleDate, 6), 6), ' ', '-')
您有一个子查询用作列,但该子查询定义了多个列。您应该重写整个查询,而不是连接到子查询。表达式select rpTotal.clinicid,SUMRPTTOTAL.rpPackage有两列。这是在允许使用标量子查询的上下文中,但标量子查询最多只能从一行返回一列。@SeanLange但是我的子查询有一个union子句,所以如果我加入子查询,我无法解释如何解释union不是问题…除非该查询也返回多行。问题是您将子查询用作列,但它定义了两列。它怎么知道你想要哪一个呢?这看起来很有希望而且合乎逻辑。但是当我在代码的第一行将表达式转换为数据类型interror时,我得到了算术溢出。除非你发布一些我可以编写代码的东西,否则我无法帮助你。sqlfiddle是这类事情的一个很好的起点。我的编码是在一个黑洞中进行的,没有任何信息。@user3681350,pl.expDuration的数据类型是什么?您应该使用ANSI-92样式的联接,而不是在那里使用的旧的89样式的联接。