【问题标题】:Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. SQL当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。 SQL
【发布时间】:2020-01-24 06:10:04
【问题描述】:

我正在尝试运行我的查询但返回 错误:当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式。

    Select 
    u.*,
    (
        Select 
            COUNT(cDays) as c,
            SUM(un) as un,
            SUM(vcs) as vcs
        From
        (
            Select
                s.DateSales as cDays,
                SUM(s.Un) as Un,
                SUM(s.VCS) as vcs
            From
                dbSales.dbo.Sales s
            Where
                s.IDX = u.IDX And s.DateSales Between DATEADD(dd,-8, u.DateS) And DATEADD(dd,-1, u.DateS)
            Group by
                s.DateSales
        ) as sct
    )

From 
    unikat u
)

【问题讨论】:

  • 添加另一个带有 SQL 标签的标签来指定你的数据库。

标签: sql sql-server


【解决方案1】:

对子查询使用APPLY 运算符:

Select 
    u.*,
    sct.*
From 
    unikat u
    OUTER APPLY 
    (
        Select
            COUNT(DISTINCT(s.DateSales)) as cDays,
            SUM(s.Un) as Un,
            SUM(s.VCS) as vcs
        From
            dbSales.dbo.Sales s
        Where
            s.IDX = u.IDX And 
            s.DateSales Between DATEADD(dd,-8, u.DateS) And DATEADD(dd,-1, u.DateS)
    ) AS sct

您可以合并由APPLY 运算符生成的任意数量的列。如果要过滤 NULL 匹配结果,请使用 CROSS APPLY 而不是 OUTER APPLY

【讨论】:

  • 子句 with 将不起作用,因为您没有添加表 'u'
【解决方案2】:

试试这个:

Select *
  From unikat u, (
    Select 
        COUNT(cDays) as c,
        SUM(un) as un,
        SUM(vcs) as vcs
    From
    (
        Select
            s.DateSales as cDays,
            SUM(s.Un) as Un,
            SUM(s.VCS) as vcs
        From
            dbSales.dbo.Sales s
        Where
            s.IDX = u.IDX And s.DateSales Between DATEADD(dd,-8, u.DateS) 
            And DATEADD(dd,-1, u.DateS)
        Group by
            s.DateSales
    ) 
) a

【讨论】:

  • 这个查询工作正常吗?选择 COUNT(cDays) 作为 c,SUM(un) 作为 un,SUM(vcs) 作为 vcs From ( 选择 s.DateSales 作为 cDays,SUM(s.Un) 作为 Un,SUM(s.VCS) 作为 vcs From dbSales。 dbo.Sales s where s.IDX = u.IDX And​​ s.DateSales between DATEADD(dd,-8, u.DateS) And DATEADD(dd,-1, u.DateS) Group by s.DateSales )
  • 是的,它工作正常。但在子查询中是问题,因为我试图在主查询中返回 3 个变量。
  • 立即尝试。编辑答案。也许加入表格。
【解决方案3】:

添加select top 1

  Select 
    u.*,
    (
        Select top 1
            COUNT(cDays) as c,
            SUM(un) as un,
            SUM(vcs) as vcs
        From
        (
            Select
                s.DateSales as cDays,
                SUM(s.Un) as Un,
                SUM(s.VCS) as vcs
            From
                dbSales.dbo.Sales s
            Where
                s.IDX = u.IDX And s.DateSales Between DATEADD(dd,-8, u.DateS) And DATEADD(dd,-1, u.DateS)
            Group by
                s.DateSales
        ) as sct
    )

From 
    unikat u
)

【讨论】:

  • 也不能正常工作,因为我试图在子查询中返回 3 个变量
  • 你的unikat表和你的子查询有什么关系?
  • s.IDX = u.IDX 和 s.DateSales 在 DATEADD(dd,-8, u.DateS) 和 DATEADD(dd,-1, u.DateS) 之间
  • 您似乎将 sum() 加入您的 unikat 表,请添加预期输出
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 2012-12-04
  • 2011-09-24
  • 2018-04-14
相关资源
最近更新 更多