Select distinct [Doc Type], [Customer Number], count([Customer Number]) , [T] From (
Select distinct A.[Customer Number] & A.[Membership Number], A.[Customer Number] , B.[Doc Type ], B.[SumOpenAmount] From(
SELECT distinct [Doc Type] , [Customer Number], Sum([Open Amount]) as T FROM Data Where [Doc Type] = 'RU')B, [Data] A
Where B.[Customer Number] = A.[Customer Number] Group by [Doc Type])
group by [Doc Type], [Customer Number]
having count([Customer Number]) = 1
抛出一个错误,文档类型可能引用SQL语句的from子句中列出的多个表
当前,您的查询存在许多语法和次优问题:
-
GROUP BY:在
SELECT
子句中包含非聚合列的聚合查询中,必须使用GROUP BY
。某些方言允许省略GROUP BY
列,但不允许访问SQL。此外,对于GROUP BY
,DISTINCT
不是必需的。 -
ALIASES:每当使用子查询和联接时,始终使用表别名,以避免派生表和所有表达式的列别名的名称冲突。此外,避免A、B、C。。。有关包括T在内的更多信息别名,请参阅Bad Habits to Kick:使用表别名,如(a,b,c(或(t1,t2,t3(。
-
EXPLICIT JOIN:使用当前的ANSI SQL显式联接标准,而不是使用
WHERE
的过时隐式联接。请参见显式与隐式SQL联接。
因此,请考虑采用上述指南的以下调整。
SELECT [doc type]
, [customer number]
, COUNT([customer number]) As CountCustomerNumber -- ALIAS ADDED
, SUM([SumOpenAmount]) As TotalOpenAmount -- AGGREGATED COLUMN
FROM
(SELECT d.[customer number] & d.[membership number] AS CustMemb -- ALIAS ADDED
, d.[customer number]
, agg.[doc type]
, SUM(agg.[TotalSubOpenAmount]) AS SumOpenAmount -- AGGREGATED COLUMN
FROM (SELECT [doc type]
, [customer number]
, SUM([open amount]) AS TotalSubOpenAmount -- INFORMATIVE ALIAS
FROM data
WHERE [doc type] = 'RU'
GROUP BY [doc type]
, [customer number]
) agg -- INFORMATIVE ALIAS
INNER JOIN [data] d -- INNER JOIN USED
ON d.[customer number] = agg.[customer number]
GROUP BY d.[customer number] & d.[membership number] -- GROUP BY COLUMNS ADDED
, d.[customer number]
, agg.[doc type]
) AS sub -- ALIAS ADDED
GROUP BY [doc type]
, [customer number]
HAVING COUNT([customer number]) = 1
注意:由于Access不支持查询中的注释。运行前删除所有--
消息
子查询中的B.[DOC TYPE]在字段名称中似乎有一个额外的空格。此外,子查询不引用内部子查询的[T]字段,因此它将不可用于主查询,除非它在Data表中
最后,外部子查询的分组依据没有指定【单据类型】来自哪个数据源进行分组。
试试这个
Select distinct
[Doc Type],
[Customer Number],
count([Customer Number]),
[T]
From
(
Select
distinct A.[Customer Number] & A.[Membership Number],
A.[Customer Number] ,
B.[Doc Type],
B.[T]
From
(
SELECT distinct
[Doc Type] ,
[Customer Number],
Sum([Open Amount]) as T
FROM
Data
Where [Doc Type] = 'RU'
)B,
[Data] A
Where B.[Customer Number] = A.[Customer Number]
Group by B.[Doc Type]
)
group by [Doc Type], [Customer Number]
having count([Customer Number]) = 1
因此,这是进行混叠的一个很好的理由。我认为发生的情况是,您最内部的(data
(子查询返回doctype
(作为外部子查询的一部分变为b
(,而a
也有一个doc type
。您还可以删除内部的Group By
子句,因为它是在最外层的查询上完成的;结果应该是相同的。
我还注意到您这样做:A.[Customer Number] & A.[Membership Number]
,然后不对该列执行任何操作。如果你想用它做点什么,你应该命名列。我在下面把它命名为CMN
,你可以选择你想要的任何东西。
你也在用) as B, [Data] A
行做一个隐含的JOIN
,我说得对吗?如果是这样的话,你应该考虑将其明确化,否则你可能会得到不想要的匹配。
如果这是你想要的,那么就这样做:
-- as B, [Data] A
++ as B LEFT JOIN [Data] as A on a.[Customer Number] = b.[Customer Number]
通过这种方式,您可以去掉Where B.[Customer Number] = A.[Customer Number]
行(当然是在测试之后(,最终得到一个更明确定义的JOIN
。看看底部是什么样子。
第一个Group by [Doc Type]
是让你绊倒的东西。
在引用字段时,我个人倾向于始终添加别名,除非我只使用一个简单的oneliner,一个表/视图,即使没有任何名称相似的字段,因为我将来通常会使用重复的名称。即使在那时,我也会尝试添加别名,因为以后如果我决定添加更多的字段/表,这不会让我重新考虑整个事情。
试试这个(如果您没有执行隐式JOIN
(:
Select distinct c.[Doc Type], c.[Customer Number], c.CMN, count(c.[Customer Number]) , c.[T]
From (
Select distinct (A.[Customer Number] & A.[Membership Number]) as CMN, A.[Customer Number] , B.[Doc Type], B.[SumOpenAmount]
From(
SELECT distinct d.[Doc Type] , d.[Customer Number], Sum(d.[Open Amount]) as T
FROM Data as d
Where d.[Doc Type] = 'RU'
) as B, [Data] A
Where B.[Customer Number] = A.[Customer Number]
) as C
group by C.[Doc Type], C.[Customer Number], C.CMN
having count(C.[Customer Number]) = 1
如果您想要一个明确的JOIN
(推荐(,请执行此操作:
Select distinct c.[Doc Type], c.[Customer Number], c.CMN, count(c.[Customer Number]) , c.[T]
From (
Select distinct (A.[Customer Number] & A.[Membership Number]) as CMN, A.[Customer Number] , B.[Doc Type], B.[SumOpenAmount]
From(
SELECT distinct d.[Doc Type] , d.[Customer Number], Sum(d.[Open Amount]) as T
FROM Data as d
Where d.[Doc Type] = 'RU'
) as B
LEFT JOIN [Data] as A on a.[Customer Number] = b.[Customer Number]
) as C
group by C.[Doc Type], C.[Customer Number], C.CMN
having count(C.[Customer Number]) = 1
(删除多余空间(