2012-09-20 79 views
1

我需要獲得一個查詢,該查詢將顯示具有相同銀行詳細信息且已被錯誤捕獲的人員的詳細信息。SQL在表中顯示重複值

我需要然後顯示正確的細節以及這些人的不正確的細節。例如:

 
1stName 1stAccNo 1stItemSold 2ndName 2ndAccNo 2ndItemSold 
Albert 2231432  Item1   John  2231432 Item3 
Robert09  Item11  Peter09 Item3 

名稱和AccNo在一張桌子上,而ItemSold在不同的桌子上。

我有以下查詢:

select p1.Name As 1stName, p1.AccNo AS 1stAccNo, I.ItemSold AS 1stItemSold, p2.Name AS 2ndName, p2.AccNo AS 2ndAccNo, I.ItemSold As 2ndItemSold 
FROM Persons p1 JOIN Persons p2 ON p1.AccNo = p2.AccNo 
INNER JOIN Items I on p.ItemID = I.ItemID 

的問題是,第二ItemSold是不正確的,因爲它是一樣的1stItemSold。我該如何改變我的查詢,以便我可以獲得正確的結果?

+2

什麼樣的SQL?你只有向人們出售2件物品? – podiluska

+0

SQL Server 2008.不,問題是,有時候,超過2人擁有相同的帳號。我找到的一個例子是具有相同帳號的8人。 – user1668123

+0

@ user1668123你能提供這兩個表的一些示例數據嗎?或者更好的創建一個[SQL小提琴](http://sqlfiddle.com/)與工作數據模型 – Taryn

回答

1

您應該將項目加入第二個表格。此外,如果你需要不同的人,你必須包含where p1.id<>p2.id其中ID是在人員表的主鍵

select 
p1.Name As 1stName, p1.AccNo AS 1stAccNo, I1.ItemSold AS 1stItemSold, 
p2.Name AS 2ndName, p2.AccNo AS 2ndAccNo, I2.ItemSold As 2ndItemSold 
FROM Persons p1 JOIN Persons p2 ON p1.AccNo = p2.AccNo 
INNER JOIN Items I1 on p1.ItemID = I1.ItemID 
INNER JOIN Items I2 on p2.ItemID = I2.ItemID 
where p1.id<>p2.id 

PS:基於評論。返回最後ItemSold避免重複:

select 
p1.Name As 1stName, p1.AccNo AS 1stAccNo, I1.ItemSold AS 1stItemSold, 
p2.Name AS 2ndName, p2.AccNo AS 2ndAccNo, I2.ItemSold As 2ndItemSold 
FROM Persons p1 JOIN Persons p2 ON p1.AccNo = p2.AccNo 
left JOIN 
    (select ItemID,ItemSold, 
      row_number() over (PARTITION BY ItemID order by DATE_SOLD DESC) as rn 
    from Items) I1 
     on (p1.ItemID = I1.ItemID) and (rn=1) 
left JOIN 
    (select ItemID,ItemSold, 
      row_number() over (PARTITION BY ItemID order by DATE_SOLD DESC) as rn 
    from Items) I2 
     on (p2.ItemID = I2.ItemID) and (rn=1) 

where p1.id<>p2.id 
+0

我試過了,但我從該查詢中得到不必要的重複結果。 – user1668123

+0

這是因爲你有一個人以上的物品。所以你應該決定在這種情況下做什麼。 – valex

+0

如果一個人有多個物品,那麼我需要根據購買日期返回購買的第一個物品。 – user1668123

1

我可能會誤解你的要求,但它聽起來像是你可以使用UNPIVOT/PIVOT功能得到你需要的結果。

如果您知道要轉換的列數,那麼您可以對此靜態版本進行硬編碼。

select * 
from 
(
    select AccNo, 
    val, 
    col + cast(rn as varchar(10)) Col_Name 
    from 
    (
    select p1.accno, 
     p1.name, 
     p1.itemid, 
     i1.id, 
     i1.i_name, 
     row_number() over(partition by accno order by name) rn 
    from persons p1 
    left join items i1 
     on p1.itemid = i1.id 
) x 
    unpivot 
    (
    val 
    for col in (name, i_name) 
) u 
) x1 
pivot 
(
    max(val) 
    for col_name in ([name1], [i_name1], [name2], [i_name2]) 
) p 

看到SQL Fiddle with Demo

但它聽起來像是你將有數目不詳的項目轉變爲列,因此你可以使用動態SQL和創造的這一動態的版本:

DECLARE @colsUnPivot AS NVARCHAR(MAX), 
    @colsPivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @colsUnPivot = stuff((select ','+C.name 
     from sys.columns as C 
     where (C.object_id = object_id('persons') 
        or C.object_id = object_id('items')) 
      and C.name like '%name%' 
     for xml path('')), 1, 1, '') 

select @colsPivot = STUFF((SELECT ',' 
         + quotename(c.name 
         + cast(p.rn as varchar(10))) 
        from 
        (
         select row_number() over(partition by accno order by name) rn 
         from persons 
        ) p 
        cross apply 
         sys.columns as C 
        where (C.object_id = object_id('persons') 
          or C.object_id = object_id('items')) 
         and C.name like '%name%' 
        group by c.name, p.rn 
        order by p.rn, c.name desc 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query 
    = 'select * 
     from 
     (
      select AccNo, 
      val, 
      col + cast(rn as varchar(10)) Col_Name 
     from 
     (
      select p1.accno, 
      p1.name, 
      p1.itemid, 
      i1.id, 
      i1.i_name, 
      row_number() over(partition by accno order by name) rn 
      from persons p1 
      left join items i1 
      on p1.itemid = i1.id 
     ) x 
     unpivot 
     (
      val 
      for col in ('+ @colsunpivot +') 
     ) u 
    ) x1 
     pivot 
     (
     max(val) 
     for col_name in ('+ @colsPivot + ') 
    )p' 

exec(@query) 

請參閱SQL Fiddle with Demo

+0

我試着複製你在上面的查詢中做了什麼,但是當涉及到pivot/unpivot時,我很失落。有沒有更簡單的方法來做到這一點? – user1668123

+0

@ user1668123如果您的列數量未知,我無法看到另一種方式來執行此操作。如果您對於pivot/unpivot是如何工作的具體問題,請詢問,我會澄清它。 – Taryn

+0

@ user1668123我不這樣做,但是您總是可以使用[SQL Fiddle](http://sqlfiddle.com/)來創建您的數據模型。 – Taryn