【发布时间】:2017-02-16 19:30:30
【问题描述】:
这是我previous post 的延续。我的两张表是这样的:
Table1
Name Id Amount
Name1 1 99
Name1 1 30
Name1 9 120.2
Name2 21 348
Name2 21 21
Name3 41 99
Name6 20 23
Table2
Name Id Return Amount
Name1 1 99
Name1 1 30
Name1 9 120.2
Name2 21 348
Name2 21 21
Name3 41 99
Name4 19 923.2
Name5 23 12
我需要一个如下所示的结果表:
Name Id Amounts Returns
Name1 1 2 2
Name1 9 1 2
Name2 21 2 1
Name3 41 1 1
Name4 1 0 1
Name5 23 0 1
Name6 20 1 0
我尝试过这样的事情:
SELECT
[Name],
[Id],
ISNULL(count([Amount]), 0) as 'Amounts'
FROM table1 AS A
GROUP BY [Name], [Id]
UNION (
SELECT
[Name],
[Id],
ISNULL(count([Return Amount]), 0) as 'Returns'
FROM
table2 AS B
GROUP BY [Name], [Id]
)
但这给了我:
Name Id Amounts
Name1 1 4
Name1 9 3
Name2 21 3
Name3 41 2
Name4 1 1
Name5 23 1
Name6 20 1
我知道我需要将Return Amount 放在 SELECT 语句中,但我不知道该怎么做,由于该联合,我尝试的所有操作都会导致语法错误。
解决这个问题的正确方法是什么?
更新 1: 试过了
SELECT
A.[Name],
A.[Id],
count(A.[Amount]),
count(B.[Return])
FROM (
SELECT
[Name],
[Id],
count([Amount]) as 'Amounts'
FROM table1
UNION
SELECT
[Name],
[Id],
count([Return]) as 'Returns'
FROM table2
) AS A
LEFT JOIN table2 as B on A.[Id] = B.[Id]
GROUP BY A.[Name], A.[Id]
但我得到了错误:
Msg 8120, Level 16, State 1, Line 8
Column 'table1.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 207, Level 16, State 1, Line 4
Invalid column name 'Amount'.
【问题讨论】:
-
你不是刚问这个吗?您可以使用该答案来解决此问题。 stackoverflow.com/questions/42280207/…
-
返回 9 应该是 1 而不是 2 ..
-
@manderson 这不是因为这里的区别在于
table2中的某些行的id 与table1中的任何内容都不匹配,但我仍然希望它们出现在结果表中。 -
在给定样本数据的情况下,Name1 ID 9 的返回计数似乎不正确。
标签: sql sql-server union