2014-12-02 30 views
1

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

假設我有表如下:

表Stock

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 

表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 

回答

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, 
+0

好吧,如果我需要EmployeeName和StockID嗎?什麼是作爲RequestDetailIds,'數字1,2 – 2014-12-02 04:13:11

+1

@AthirahHazira'XML路徑( '')),1,2, '')的功能。 。 。 (1)你可以加入外部查詢中的'user'表; (2)此查詢具有庫存ID。 – 2014-12-02 04:13:54

+0

反正,我試過你的查詢,並有一個錯誤,說'轉換失敗時varchar值','數據類型int' – 2014-12-02 04:19:14