【问题标题】:Inner Join and Group Multiple Tables into one row内部联接和将多个表分组为一行
【发布时间】:2014-12-02 03:58:53
【问题描述】:

我正在使用 MSSQL Server,我想 INNER JOINGROUP 来自多个表的数据。但是我收到了这个错误:

Column 'MyDB.dbo.USER.EmployeeID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

假设我有如下表格:

表格库存

    StockID        StockName
    ---------------------------
    1              StockOne
    2              StockTwo

表用户

    EmployeeID    EmployeeName
    ---------------------------
    A001          ABC
    A002          ABCD

餐桌申请

    RequisitionID    RequestDetailsID    RequestNumber   EmployeeID
    ---------------------------------------------------------------
    1                1                   RN001           A001
    2                2                   RN001           A001
    3                3                   RN002           A002
    4                4                   RN003           A001

TABLE REQUISITION_DETAILS

    RequestDetailsID   EmployeeID    StockID
    ------------------------------------------
    1                 A001          1
    2                 A001          2
    3                 A002          1
    4                 A001          2

这是我的 SQL 语法

SELECT *

    FROM [MyDB].[dbo].[USER] A

    INNER JOIN
    [MyDB].[dbo].[REQUISITION] B
    ON
    B.EmployeeID = A.EmployeeID

    INNER JOIN  
    [MyDB].[dbo].[REQUISITION_DETAILS] C
    ON
    C.RequestDetailsID = B.RequestDetailsID

    INNER JOIN [MyDB].[dbo].[STOCK] D
    ON
    D.StockID = C.StockID

    WHERE EmployeeID = '$EpID'
    GROUP BY B.RequestNumber

预期输出

    RequestNumber   RequestDetailsID   EmployeeID    EmployeeName     StockID
    ------------------------------------------------------------------------------
    RN001           1, 2               A001          ABC              1, 2
    RN002           3                  A002          ABCD             1
    RN003           4                  A001          ABC              2

【问题讨论】:

    标签: sql-server database group-by inner-join string-aggregation


    【解决方案1】:

    这是一个棘手的查询,原因有几个。首先,SQL Server 有一种相当痛苦的方式来进行聚合字符串连接。然后,您会遇到连接不同表中的请求编号和员工的问题。

    据我所知,您只需要两个表,requisitionrequisition_details。以下查询应该接近您的需要:

    select distinct r.RequestNumber, r.EmployeeId,
           stuff((select ', ' + cast(rd.RequestDetailsId as varchar(255))
                  from requisition r2 join
                       requisition_details rd
                       on r2.RequestDetailsID = rd.RequestDetailsID
                  where r2.RequestNumber = r.RequestNumber and r2.EmployeeId = r.EmployeeId
                  for xml path ('')
                 ), 1, 2, '') as RequestDetailIds,
           stuff((select ', ' + cast(rd.StockId as varchar(255))
                  from requisition r2 join
                       requisition_details rd
                       on r2.RequestDetailsID = rd.RequestDetailsID
                  where r2.RequestNumber = r.RequestNumber and r2.EmployeeId = r.EmployeeId
                  for xml path ('')
                 ), 1, 2, '') as StockIds
    from requisition r
    

    编辑:

    要插入换行符,我会使用:

           stuff((select '
    ' + cast(rd.RequestDetailsId as varchar(255))
                  from requisition r2 join
                       requisition_details rd
                       on r2.RequestDetailsID = rd.RequestDetailsID
                  where r2.RequestNumber = r.RequestNumber and r2.EmployeeId = r.EmployeeId
                  for xml path ('')
                 ), 1, 2, '') as RequestDetailIds,
    

    【讨论】:

    • 好的,如果我也需要 EmployeeName 和 StockID 怎么办?而xml path ('')), 1, 2, '') as RequestDetailIds,数字1、2的作用是什么
    • @AthirahHazira 。 . . (1) 您将在外部查询中加入user 表; (2) 此查询有股票 ID。
    • 无论如何,我已经尝试过您的查询,但有一个错误提示 Conversion failed when converting the varchar value ', ' to data type int
    • 除了我的最后一条评论,当我去掉逗号时,查询返回像这样的值 <RequestDetailsId>126</RequestDetailsId><RequestDetailsId>127</RequestDetailsId> 我不明白。我的意思是我到处搜索,每个人都使用逗号或分号来分隔值,它工作正常。我也尝试过其他示例,但错误仍在字符串转换上
    • @AthirahHazira 。 . .只有当StockIdRequestDetailsId 是数字时才会发生这种情况。但根据问题中的相同数据,显然不是。当然,您可以将它们包装在 cast(<x>) as varchar(255)) 中。
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多