0

次のデータがあり、MS Access SQL または MS SQL Server を使用してクエリを作成し、すべてを 1 行にまとめる方法を見つけたいと考えています。

RespondentID  Name             EID       Phone      Why     How          Contact
1809593812                                                  Testing      0
1809593812                                          Testing              0
1809593812                     19091193                                  0
1809593812    Jennifer                                                   0
1809593812                               8885555555                      0

私はそれが次のようになりたい:

RespondentID   Name             EID       Phone       Why     How      Contact
1809593812     Jennifer         19091193  8885555555  Testing Testing  0

これは、MS Access SQL Query または MS SQL Server Query を使用して可能ですか?

このような記録は他にもたくさんあります。外部ソースからの毎日のエクスポートであるため、レイアウトを制御することはできません。

私がこれまでにMS Access Queryで持っているのは次のとおりです。

SELECT DISTINCT dbo_ResponsesText.RespondentID,
IIf(dbo_ResponsesText.Key1=4383976121,ResponseText,Null) AS Name, 
IIf(dbo_ResponsesText.Key1=4383976120,ResponseText,Null) AS EID,
IIf(dbo_ResponsesText.Key1=4388819402,ResponseText,Null) AS Phone, 
IIf(dbo_ResponsesText.QuestionID=340372755,ResponseText,Null) AS Why, 
IIf(dbo_ResponsesText.QuestionID=340372805,ResponseText,Null) AS How, 
IIf(dbo_Responses.Key1=4305593988,-1,0) AS Contact
FROM dbo_ResponsesText
INNER JOIN dbo_Responses ON dbo_ResponsesText.RespondentID = dbo_Responses.RespondentID
ORDER BY dbo_ResponsesText.RespondentID

実際のテーブル構造:

dbo_ResponsesText Table
ID   RespondentID  CollectorID  QuestionID  Key1  ResponseText   DateAdded
1    1821607396    25982810     340372755   0     Name,EID,etc.  5/1/2012 3:29:00 PM

dbo_Responses Table:
RespondentID   CollectorID  QuestionID  Key1         Key2  Key3
1809593812     25982810     340372567   4308039090   0     0
4

2 に答える 2

0

Sandr Posted の提案は有効です。必要な唯一の変更は、次の x.Contact を max(x.Contact) に変換することでした。

変化する

x.RespondentID、名前として max(x.Name)、EID として max(x.EID)、電話として max(x.Phone)、理由として max(x.Why)、方法として max(x.How) を選択します。 x.お問い合わせ

x.RespondentID、名前として max(x.Name)、EID として max(x.EID)、電話として max(x.Phone)、理由として max(x.Why)、方法として max(x.How) を選択します。 max(x.Contact) 連絡先として

最終的なクエリは次のようになります。

SELECT 
    x.RespondentID
    , Max(x.Name) AS Name
    , Max(x.EID) AS EID
    , Max(x.Phone) AS Phone
    , Max(x.Why) AS Why
    , Max(x.How) AS How
    , Max(x.Contact) As Contact
FROM (
     SELECT 
        r.RespondentID
            , IIf(t.Key1=4383976121,ResponseText, Null) AS Name
            , IIf(t.Key1=4383976120 ,ResponseText, Null) AS EID
            , IIf(t.Key1=4388819402,ResponseText, Null) AS Phone
            , IIf(t.QuestionID=340372755,ResponseText, Null) AS Why
            , IIf(t.QuestionID=340372805,ResponseText, Null) AS How
            , IIf(r.Key1=4305593988,-1,NULL) AS Contact 
     FROM dbo_ResponsesText AS t 
     INNER JOIN dbo_Responses AS r ON t.RespondentID = r.RespondentID
)  AS x
GROUP BY x.RespondentID
ORDER BY x.RespondentID;

これにより、次の望ましい出力が得られました。

RespondentID  Name     EID       Phone         Why            How            Contact
1811504405    Jenn     123456    456456        Because        Nothing        -1
1820992008    ANDRIA   19289935  909-437-XXXX  Long Response  Long Response   0

追加の参照用に、同じタイプのクエリを MSSQL Server 形式で含めました。

SELECT 
x.RespondentID
    , Max(x.Name) AS Name
    , Max(x.EID) AS EID
    , Max(x.Phone) AS Phone
    , Max(x.Why) AS Why
    , Max(x.How) AS How
    , Max(x.Contact) As Contact
FROM (
    SELECT
     RespondentID = r.RespondentID
     ,Name = 
              CASE WHEN t.[Key1] = '4383976121' THEN [ResponseText] 
              ELSE NULL END

     ,EID = 
              CASE WHEN t.[Key1] = '4383976120' THEN [ResponseText] 
              ELSE NULL END

     ,Phone = 
              CASE WHEN t.[Key1] = '4388819402' THEN [ResponseText] 
              ELSE NULL END

     ,Why = 
              CASE WHEN t.[QuestionID] = '340372755' THEN [ResponseText] 
              ELSE NULL END

     ,How = 
              CASE WHEN t.[QuestionID] = '340372805' THEN [ResponseText] 
              ELSE NULL END

     ,Contact = 
              CASE WHEN r.[Key1] = '4305593988' THEN 'True'
              ELSE 'False' END

     FROM [NPS].[dbo].[ResponsesText] t

     Join [NPS].[dbo].[Responses] r ON t.RespondentID=r.RespondentID
)  AS x
GROUP BY x.RespondentID
ORDER BY x.RespondentID;
于 2013-10-30T23:46:21.670 に答える