Sql 错误:当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式

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(

我有下面的查询,它给了我一个错误,当子查询没有引入EXISTS时,只能在select列表中指定一个表达式。我不知道这在技术上有什么问题

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样式的联接。