让表C和V具有这些值
>> Table V <<
| UnID | BillID | ProductDesc | Value | ... |
| 1 | 1 | 'Orange Juice' | 3.05 | ... |
| 1 | 1 | 'Apple Juice' | 3.05 | ... |
| 1 | 2 | 'Pizza' | 12.05 | ... |
| 1 | 2 | 'Chocolates' | 9.98 | ... |
| 1 | 2 | 'Honey' | 15.98 | ... |
| 1 | 3 | 'Bread' | 3.98 | ... |
| 2 | 1 | 'Yogurt' | 8.55 | ... |
| 2 | 1 | 'Ice Cream' | 7.05 | ... |
| 2 | 1 | 'Beer' | 9.98 | ... |
| 2 | 2 | 'League of Legends RP' | 40.00 | ... |
>> Table C <<
| UnID | BillID | ClientName | ... |
| 1 | 1 | 'Alexander' | ... |
| 1 | 2 | 'Tom' | ... |
| 1 | 3 | 'Julia' | ... |
| 2 | 1 | 'Tom' | ... |
| 2 | 2 | 'Alexander' | ... |
表C包含每种产品的值,这些值与帐单号相关联。表V具有客户名称和帐单号之间的关系。但是,帐单号有一个计数器,该计数器取决于UnId,即商店统一ID。话虽这么说,每个商店都有自己的1号,2号等票据。此外,每个商店的票据数量也不相等。
我试图在C左联接V之间进行选择,而不会成功。因为每个BillID都依赖于UnID,所以我必须考虑这两个列之间的连接进行连接。 我使用了此脚本,但它给了我一个错误。
SELECT
SUM(C.Value),
V.ClientName
FROM
C
LEFT JOIN
V
ON
CONCAT(C.UnID, C.BillID) = CONCAT(V.UnID, V.BillID)
GROUP BY
V.ClientName
,SQL Server将此'CONCAT' is not a recognized built-in function name
返回给我。
我正在使用Microsoft SQL Server 2008 R2
使用CONCAT是否错误?还是我尝试选择的方式?你能帮我一下吗?
[OBS:我为您提供的表格仅用于解释我的困难。话虽如此,如果您在解释中发现任何错误,请让我知道以纠正它们。]
答案 0 :(得分:4)
您应该加入两个表中UnID
和BillID
列的相等性:
SELECT
c.ClientName,
COALESCE(SUM(v.Value), 0) AS total
FROM C c
LEFT JOIN V v
ON c.UnID = v.UnID AND
c.BillID = v.BillID
GROUP BY
c.ClientName;
在理论中,您可以尝试加入CONCAT(UnID, BillID)
。但是,您可能会遇到问题。例如,UnID = 1
与BillID = 23
串联在一起,将与UnID = 12
和BillID = 3
相同。
注意:我们用COALESCE
包装总和,因为如果给定的客户端在V
表中没有条目,则总和将返回NULL
,然后将其替换为零。
答案 1 :(得分:0)
concat仅在sql server 2012中可用。
这是一个选择。
SELECT
SUM(C.Value),
V.ClientName
FROM
C
LEFT JOIN
V
ON
cast(C.UnID as varchar(100)) + cast(C.BillID as varchar(100)) = cast(V.UnID as varchar(100)) + cast(V.BillID as varchar(100))
GROUP BY
V.ClientName