Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 内部联接并将多个表分组到一行中_Sql Server_Database_Group By_Inner Join_String Aggregation - Fatal编程技术网

Sql server 内部联接并将多个表分组到一行中

Sql server 内部联接并将多个表分组到一行中,sql-server,database,group-by,inner-join,string-aggregation,Sql Server,Database,Group By,Inner Join,String Aggregation,我使用的是MSSQL服务器,我希望内部连接和分组来自多个表的数据。但我有一个错误: 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 ------------

我使用的是MSSQL服务器,我希望
内部连接
分组
来自多个表的数据。但我有一个错误:

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
表格请购单详细信息

    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

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

据我所知,您只需要两个表,
requisition
requisition\u 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,

好吧,如果我也需要雇员姓名和股票ID呢?作为requestDetailId,xml路径(“”)),1,2,,)的函数是什么,2@AthirahHazira . . . (1) 您将加入外部查询中的
user
表;(2) 此查询具有股票ID。无论如何,我尝试过您的查询,但出现了一个错误,显示在将varchar值“”转换为数据类型int时,
转换失败。
除了我的上一条注释之外,当我去掉逗号时,查询返回的值如下所示
126127
我不明白。我的意思是,我到处搜索,每个人都用逗号或分号来分隔值,效果很好。我也尝试过其他示例,但错误仍在字符串上conversion@AthirahHazira . . . 只有当
StockId
RequestDetailsId
where numeric时才会发生这种情况。但根据问题中相同的数据,它们显然不是。当然,您可以将它们包装在
cast()中作为varchar(255))