我有一些我試圖從舊系統中組織的資料。它在資料庫中的單獨行中列出了我們的電子郵件和號碼。
CREATE TABLE #temptable ( [LookupCode] char(10), [Title] varchar(20), [FirstName] varchar(30), [MiddleName] varchar(16), [LastName] varchar(30), [Number] varchar(150), [EmailWeb] varchar(150), [TypeCode] char(3), [Primary] int )
INSERT INTO #temptable ([LookupCode], [Title], [FirstName], [MiddleName], [LastName], [Number], [EmailWeb], [TypeCode], [Primary])
VALUES
( 'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '', '[email protected]', 'EM1', 1 ),
( 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '01363936541', '', 'RES', 0 ),
( 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '', '[email protected]', 'EM1', 0 ),
( 'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '073321663', '', 'RES', 1 )
SELECT * FROM #temptable t
DROP TABLE #temptable
這基本上回傳資料,如以下 SQL Fiddle 所示:

我已經設法通過最初執行子查詢來獲得結果 - 但是在這個例子中這些失敗了,因為同一個 LookupCode 有多個聯系人,子查詢只適用于一條記錄。
最終應該只有兩行 - 一行是 Jessie,另一行是 Joe,號碼和電子郵件都在同一行。
WHERE TypeCode = 'EM1'
用于電子郵件,RES 用于家庭電話 - 我已洗掉 ACT 型別代碼,因為它是錯誤的。
將不勝感激我曾嘗試使用 PIVOT,但結果喜憂參半 - UNPIVOT 不適用于資料已經是 UNPIVOT 格式,基本上是基于 TypeCode 過濾的內容。
**更新 - 樞軸示例 **
WITH
cte
AS (
SELECT
c.LookupCode
, cn.LkPrefix 'Title'
, cn.FirstName
, cn.MiddleName
, cn.LastName
, CAST(cn2.Number AS VARCHAR(150)) 'Number'
, CAST(cn2.EmailWeb AS VARCHAR(150)) 'EmailWeb'
, cn2.TypeCode
, cn2.TypeCode 'TypeCode2'
, c.UniqEntity
, cn2.UniqContactName
, IIF(c.UniqContactNamePrimary = cn2.UniqContactName, 1, 0) "Primary"
FROM
dbo.Client c
LEFT OUTER JOIN
dbo.ContactNumber cn2
ON cn2.UniqEntity = c.UniqEntity --AND cn2.UniqContactName = c.UniqContactNamePrimary
LEFT OUTER JOIN dbo.ContactName cn ON c.UniqEntity = cn.UniqEntity AND cn2.UniqContactName = cn.UniqContactName
WHERE
c.LookupCode = @LookupCode
)
select RES 'Home', MOB 'Mobile', EM1 'Email', [Primary], FirstName, LastName
from
(
select *
from cte
) d
pivot
(
max(Number)
for TypeCode in (RES, MOB)
) piv
pivot
(
max(EmailWeb)
for TypeCode2 in (EM1)
) piv2
結果

uj5u.com熱心網友回復:
我試了一下,也許我錯過了一些東西,但我沒有看到 PIVOT 的必要
with data (LookupCode, Title, FirstName, MiddleName, LastName, Num, EmailWeb,
TypeCode, Primary)as (
select
'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '', '[email protected]', 'EM1', 1 from dual union all
select 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '01363936541', '', 'RES', 0 from dual union all
select 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '', '[email protected]', 'EM1', 0 from dual union all
select 'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '073321663', '', 'RES', 1 from dual
)
select d1.LookupCode
, d1.Title
, d1.FirstName
, d1.MiddleName
, d1.LastName
, (select Num from data d2 where d1.LookupCode = d2.LookupCode
and d1.Title = d2.Title
and d1.FirstName = d2.FirstName
and d2.TypeCode != 'EM1') num2
, d1.EmailWeb
, d1.TypeCode
, d1.Primary
from data d1
where d1.TypeCode = 'EM1'
uj5u.com熱心網友回復:
我個人會在這里使用條件聚合。你沒有解釋你想用TypeCode和Primary值做什么,所以我省略了它們,但是,如果你確實希望在查詢中使用它們,它們將需要以某種方式聚合,而不是添加到GROUP BY(將它們添加到GROUP BY遺囑中)導致多行):
SELECT t.LookupCode,
t.Title,
t.FirstName,
t.LastName,
MAX(t.Number) AS Number,
MAX(t.EmailWeb) AS EmailWeb
FROM #temptable t
GROUP BY t.LookupCode,
t.Title,
t.FirstName,
t.LastName;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336011.html
標籤:sql sql-server
