簡體   English   中英

MSSQL連接查詢與分組依據

[英]MSSQL join query with Group by

我的表結構是這樣的:

ID      SID Type        Description SN
82      372 PC          XX          1234ZZ
83      372 Monitor     YYY         2234ZZ
587     444 PC          BBB         2255XX  
588     444 Monitor     CCC         4512XC

我想創建一個VIEW,以按SID(員工ID)顯示同一行組中的所有記錄

我的sql如下:

SELECT      DISTINCT a.SID, 
            CAST(b.Description AS NVARCHAR(100)) AS Name_PC, 
            CAST(b.SN AS NVARCHAR(100)) AS SN_PC, 
            CAST(c.Description AS NVARCHAR(100)) AS Name_Monitor, 
            CAST(c.SN AS NVARCHAR(100)) AS SN_Monitor, 
            dbo.StaffDB.DisplayName
FROM        dbo.IT_Equ AS a INNER JOIN
            dbo.StaffDB ON a.SID = dbo.StaffDB.SID LEFT OUTER JOIN
            dbo.IT_Equ AS b ON a.SID = b.SID AND b.Type = 'PC' LEFT OUTER JOIN
            dbo.IT_Equ AS c ON a.SID = c.SID AND c.Type = 'Monitor'
WHERE     (b.Description IS NOT NULL) AND (b.SN IS NOT NULL) 
            AND (c.Description IS NOT NULL) AND (c.SN IS NOT NULL)
GROUP BY    a.SID, CAST(b.Description AS NVARCHAR(100)), 
            CAST(b.SN AS NVARCHAR(100)), 
            CAST(c.Description AS NVARCHAR(100)), 
            CAST(c.SN AS NVARCHAR(100)), 
            StaffDB.DisplayName

如果staf僅在PC和顯示器上有一條記錄,則該代碼可以正常工作,它將顯示以下結果:

SID Name_PC SN_PC   Name_Monitor    SN_Monitor  DisplayName
372 XX      1234ZZ  YYY             2234ZZ      Peter   
444 BBB     2255XX  CCC             4512XC      John

但是,如果員工擁有多個PC記錄或監控記錄,它將創建重復記錄,例如

db中的原始記錄:

ID      SID     Type        Description     SN  
106     476     PC          PC018           84TK5   
107     476     Monitor     LCD018          60P5D   
421     476     PC          PC220           85HYC   
422     476     Monitor     LCD220          51RMR   

結果是這樣的:

SID     Name_PC     SN_PC       Name_Monitor    SN_Monitor      DisplayName
476     PC018       84TK5       LCD018          60P5D           Mary
476     PC018       84TK5       LCD220          51RMR           Mary
476     PC220       85HYC       LCD018          60P5D           Mary
476     PC220       85HYC       LCD220          51RMR           Mary

有可能增強查詢成為這個嗎?

SID     Name_PC     SN_PC       Name_Monitor    SN_Monitor      DisplayName
476     PC018       84TK5       LCD018          60P5D           Mary
476     PC220       85HYC       LCD220          51RMR           Mary

謝謝

問題出在數據上-您必須修復重復項。 顯然1台顯示器屬於2台PC-
PC018 - 60P5DPC220 - 60P5D 或者,您可以嘗試安排它們,並以某種方式將第一台SN用於第一台PC,依此類推,但是我認為這不是正確的方法。

您如何確定要使用哪個sn_pc?

唯一性不會解決您的問題,唯一性只會消除相同的線條。

如果可能,您必須進行匯總:min(sn_pc)您可以在子查詢中使用視圖函數:row_number over(按sid分區,按name_pc順序按sn_pc分區),然后其中rownum = 1

但是,當再次讀取結果時,似乎在聯接表時缺少聯接條件

dbo.IT_Equ AS c ON a.SID = c.SID AND c.Type = 'Monitor'

這是問題所在,請盡可能使用子查詢選擇最后一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM