2016-04-06 28 views
1

我有一個表名爲具有以下內容:查詢與共享密鑰字段成單個結果列多行,每鍵


    FormType KeyField Field AlphaValue   NumericValue 
    -------- --------- ------- -------------------- ------------- 
    A  AAA001 A001 EXT     0.000000 
    A  AAA001 A002 mail     0.000000 
    A  AAA001 A003       190.000000 
    A  AAA001 A004 [email protected] 0.000000 
    A  ABC123 A001 DIST     0.000000 
    A  ABC123 A002 something    0.000000 
    A  ABC123 A003       215.000000 
    A  BBB255 A002 delivery    0.000000 
    A  BBB255 A003       94.000000 
    A  CCC923 A002 TECH     0.000000 
    A  DDD123 A004 [email protected]  0.000000 

期望的結果需要是關鍵字段隨後每可能的字段(在這種情況下,A001,A002,A003,A004),類似的:


    TypeA A001   A002   A003  A004 
    ------- ------------ ------------ ----------- -------------------- 
    AAA001 EXT   mail   190.000000 [email protected] 
    ABC123 DIST   something 215.000000 
    BBB255    delivery  94.000000 
    CCC923 TECH      0.000000 
    DDD123       0.000000 [email protected] 

我一直在做這個,但並不真正反映所需的結果:


    select 
    a.KeyField as 'TypeA', 
    b.AlphaValue as 'A001', 
    c.AlphaValue as 'A002', 
    d.NumericValue as 'A003', 
    e.AlphaValue as 'A004' 
    from (select distinct KeyField from Form where FormType = 'A') as a, 
    (select AlphaValue, KeyField from Form where FormType = 'A' and Field = 'A001') as b, 
    (select AlphaValue, KeyField from Form where FormType = 'A' and Field = 'A002') as c, 
    (select NumericValue, KeyField from Form where FormType = 'A' and Field = 'A003') as d, 
    (select AlphaValue, KeyField from Form where FormType = 'A' and Field = 'A004') as e 
    where 
    b.KeyField = a.KeyField 
    and c.KeyField = a.KeyField 
    and d.KeyField = a.KeyField 
    and e.KeyField = a.KeyField 

前面的查詢結果:


    TypeA A001   A002   A003  A004 
    ------- ------------ ------------ ----------- -------------------- 
    AAA001 EXT   mail   190.000000 [email protected] 

它只是跳過沒有爲每一個需要的領域,結果所有的鑰匙,當我需要的是必填字段不有一個匹配被替換爲空字符串或0.000000。

關於如何達到預期結果的任何想法?

+0

您需要了解如何使用連接而不是逗號分隔的查詢。您編碼的方式是對每個查詢的內部連接。當你使用EAV模式的數據結構時,這是一個真正的問題。 –

+0

如果您可以將您的示例發佈爲易於使用的東西,我可以幫助您構建查詢以從中獲取數據。這篇文章是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

回答

1

嘗試這樣:

SELECT 
    master.KeyField AS 'TypeA', 
    ISNULL(A001.AlphaValue, '') AS 'A001', 
    ISNULL(A002.AlphaValue, '') AS 'A002', 
    ISNULL(A003.NumericValue, 0) AS 'A003', 
    ISNULL(A004.AlphaValue, '') AS 'A004' 
FROM (
    SELECT FormType, KeyField 
    FROM Form 
    WHERE FormType = 'A' 
    GROUP BY FormType, KeyField 
) AS master 
LEFT JOIN Form AS A001 
    ON master.FormType = A001.FormType AND master.KeyField = A001.KeyField AND A001.Field = 'A001' 
LEFT JOIN Form AS A002 
    ON master.FormType = A002.FormType AND master.KeyField = A002.KeyField AND A002.Field = 'A002' 
LEFT JOIN Form AS A003 
    ON master.FormType = A003.FormType AND master.KeyField = A003.KeyField AND A003.Field = 'A003' 
LEFT JOIN Form AS A004 
    ON master.FormType = A004.FormType AND master.KeyField = A004.KeyField AND A004.Field = 'A004' 

基本上我們正在查詢的唯一密鑰,然後離開加盟其他所有領域。 ISNULL函數提供默認值。

2

如果你是無論如何做一個彙總(這是什麼distinct基本一樣),那你還不如使用條件彙總:

select KeyField, 
     max(case when keyfield = 'A001' then alphafield else '' end) as A001, 
     max(case when keyfield = 'A002' then alphafield else '' end) as A002, 
     max(case when keyfield = 'A003' then NumericValue else 0 end) as A003, 
     max(case when keyfield = 'A004' then alphafield else ''end) as A004 
from Form 
where FormType = 'A' 
group by KeyField; 

這假定有每個按鍵只有一個值(正如問題所暗示的那樣)。

+0

最好用hack :)但是你需要添加GROUP BY子句 –

+0

@PavelMorshenyuk。 。 。謝謝。 –