簡體   English   中英

如何有效地在SQL代碼中使用聯接和數據透視

[英]How can I efficiently use join and pivot in my SQL code

我有3張桌子。 該查詢僅返回記錄的排序即可返回所需的結果。 我添加了“排序依據”,但是沒有用。

在此處輸入圖片說明

結果應為:

在此處輸入圖片說明

我得到的結果只是記錄的排序。 我想按ID排序,但是不起作用。

查詢:

WITH NAMES AS (

   SELECT

      P.NAMES,
      P.CODE,
      Q.NUM_TYP,
      Q.PHONE_NUM
   FROM
      dbo.NAMES P

      INNER JOIN dbo.PHONE Q 
         ON P.ID = Q.ID
      LEFT JOIN DBO.ADDRESS S
         ON P.PRSN_IK = S.PRSN_IK
      WHERE S.ADDR Is Null  

)

SELECT *    
FROM
NAMES    
PIVOT (Max(PHONE_NUM) FOR NUM_TYP IN (WORK, HOME)) R;

感謝任何輸入。 謝謝。

試試trhis:

select f1.Name, nullif(f1.code, '') Code ,
isnull(f2.phone_num, 'N/A') work_phone_num, isnull(f3.phone_num, 'N/A') home_phone_num
from Names f1
left outer join Phone f2 on f1.id=f2.id and f2.Num_type='WORK'
left outer join Adress f2b on f2.id=f2b.id and f2.num_type=f2b.add_type
left outer join Phone f3 on f1.id=f3.id and f3.Num_type='HOME'
left outer join Adress f3b on f3.id=f3b.id and f3.num_type=f3b.add_type
where f2b.id is null or f3b.id is null

鑒於您的查詢正在工作,這應該工作:

;WITH NAMES AS (
SELECT
  P.NAMES,
  P.CODE,
  Q.NUM_TYP,
  Q.PHONE_NUM
FROM dbo.NAMES P
  INNER JOIN dbo.PHONE Q 
     ON P.ID = Q.ID
  LEFT JOIN DBO.ADDRESS S
     ON P.PRSN_IK = S.PRSN_IK
  WHERE S.ADDR Is Null  
), PIVOTED 
AS
(
 SELECT *
 FROM NAMES
 PIVOT (Max(PHONE_NUM) FOR NUM_TYP IN (WORK, HOME)) R
)
SELECT * FROM PIVOTED piv
inner join [dbo].[NAMES] nam
on piv.names = nam.names
ORDER BY nam.ID

我已包含P.ID,並將所有內容包裝在子查詢下。

暫無
暫無

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

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