sql-server - 内部联接并将多个表分组为一行

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

我正在使用 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.

假设我有如下表格:

餐 table 库存

    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 有一种相当痛苦的聚合字符串连接方式。然后,您会遇到连接不同表中的请求编号和员工的问题。

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

关于sql-server - 内部联接并将多个表分组为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27241631/

相关文章:

php - Zend Framework 2 模型中的数据库访问

sql-server - 在 Entity Framework 中处理 View 关系

sql-server - SQL 查询中的两个转义字符

sql - 在 SQL Server 中使用具有两个条目(值)的同一个表中的另一列更新列

sql-server - 仅从datetime sql获取日期而不转换为varchar,以便我可以在excel中对其进行排序

c# - 查询字符串的 SQL 注入(inject)技术

php - 建立数据库连接时出错 - WP 主机更改了密码

Python Pandas 从 Groupby 中选择组的随机样本

mysql - COUNT() 和 Left Join 不起作用

python - 使用分组依据并创建 CSV