【问题标题】:How to use COUNT() in subquery如何在子查询中使用 COUNT()
【发布时间】:2015-10-27 10:32:05
【问题描述】:

我的查询为您提供在日期“2014-06-01”和“2014-12-31”之间具有销售标题或销售发票的客户。

现在我想创建两个新列,显示在日期“2014-06-01”和“2014-12-31”之间有多少销售发票以及每个客户获得的销售标题。

这里的问题是我真的不明白如何思考,我得到这个错误

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

这是我的 SQL 查询。

SELECT t1.Name, /*THIS PART GIVES ME THE ERROR*/ (SELECT COUNT(t5.[Bill-to Customer No_]) as he
                FROM [dbo].[MNO International AB$Sales Header] t5
                WHERE EXISTS
                            (SELECT * FROM [dbo].[MNO International AB$Customer] t6 
                                WHERE t5.[Bill-to Customer No_]=t6.[No_])
                GROUP BY t5.[Bill-to Name]
                ) as TempSa


FROM [dbo].[MNO International AB$Customer] t1
WHERE (EXISTS
         (SELECT *
          FROM [dbo].[MNO International AB$Sales Header] t2
          WHERE t2.[Bill-to Customer No_] =t1.[No_])
       OR EXISTS
         (SELECT *
          FROM [dbo].[MNO International AB$Sales Invoice Header] t3
          WHERE t3.[Posting Date] BETWEEN '2014-06-01' AND '2014-12-31' AND t3.[Bill-to Customer No_] = t1.No_))

这两个查询为我提供了正确数量的每个客户的销售标题和每个客户日期之间的发票。如何将这两个查询合并到上面查询中的select语句中?

    SELECT t1.[Bill-to Name], COUNT(t1.[Bill-to Customer No_]) as Temp
FROM [dbo].[MNO International AB$Sales Header] t1
WHERE EXISTS
            (SELECT * FROM [dbo].[MNO International AB$Customer] t2 
                WHERE t1.[Bill-to Customer No_]=t2.[No_] )
GROUP BY t1.[Bill-to Name]

.

SELECT t1.[Bill-to Name], COUNT(t1.[Bill-to Customer No_]) as Temp
FROM [dbo].[MNO International AB$Sales Invoice Header] t1
WHERE EXISTS
            (SELECT * FROM [dbo].[MNO International AB$Customer] t2 
                WHERE t1.[Bill-to Customer No_]=t2.[No_] AND t1.[Posting Date] BETWEEN '2014-06-01' AND '2014-12-31' AND t2.[No_]='101716' )
GROUP BY t1.[Bill-to Name]

【问题讨论】:

  • 您的查询使用的是 SQL Server 语法约定,所以我将标签从 mysql 更改为 sql-server。

标签: sql-server count subquery


【解决方案1】:

您在子查询中有一个GROUP BY。我不确定您是否只需要删除它或用相关子句替换它,但这将修复语法错误:

SELECT t1.Name, 
       (SELECT COUNT(t5.[Bill-to Customer No_]) as he
        FROM [dbo].[MNO International AB$Sales Header] t5
        WHERE EXISTS (SELECT 1
                      FROM [dbo].[MNO International AB$Customer] t6 
                      WHERE t5.[Bill-to Customer No_] = t6.[No_]
                     ) 
      ) as TempSa

但是,我认为你想要的价值是:

SELECT t1.Name, 
       (SELECT COUNT(t5.[Bill-to Customer No_]) as he
        FROM [dbo].[MNO International AB$Sales Header] t5
        WHERE EXISTS (SELECT 1
                      FROM [dbo].[MNO International AB$Customer] t6 
                      WHERE t5.[Bill-to Customer No_] = t6.[No_]
                     ) AND
              t5.[Bill-to Name] = t1.Name
--------------^ correlation clause instead of `GROUP BY`
      ) as TempSa

【讨论】:

  • 非常感谢!我知道它会以某种方式起作用,但不知道如何使它起作用:)
猜你喜欢
  • 2019-07-03
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-18
  • 1970-01-01
相关资源
最近更新 更多