从左联接后的两列串联中选择

时间:2019-09-26 07:01:54

标签: sql sql-server join select

问题描述

让表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:我为您提供的表格仅用于解释我的困难。话虽如此,如果您在解释中发现任何错误,请让我知道以纠正它们。]

2 个答案:

答案 0 :(得分:4)

您应该加入两个表中UnIDBillID列的相等性:

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 = 1BillID = 23串联在一起,将与UnID = 12BillID = 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