2

私の SQL スキルは優れていないため、投稿します。

会社に基づいてすべての連絡先名を取得しようとしています。

たとえば、次の 2 つのステートメントがあります。

Select Id, CompanyName, Address From Clients
Select ClientId, ContactName From Contacts

1 人のクライアントに多くの連絡先がある場合があります

結果: (1 つの列にすべての連絡先名が必要です)

ContactName         Company    Address
----------------------------------------
Johh, Steve         123 Comp   12345 Address
David,Mike, Sarah   44 Comp    111 Address

実際の例は非常に高く評価されます。

4

4 に答える 4

1
SELECT DISTINCT (
SELECT ISNULL(ct.ContactName, '') + ', '
FROM dbo.Clients cl JOIN dbo.Contacts ct ON cl.Id = ct.ClientId
WHERE cl.ID = cl2.Id
FOR XML PATH('')) AS ContactName, CAST(cl2.Id AS nvarchar(7)) + ' ' + cl2.CompanyName AS Company, Address
FROM dbo.Clients cl2
ORDER BY 2

SQLFiddle のデモ

于 2012-11-08T22:57:47.697 に答える
0

テーブル結合を行う必要があるようです。

例:ここに2つのテーブル

1. Person
2. Orders

クエリ:

SELECT 
    Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders ON Persons.P_Id = Orders.P_Id
ORDER BY Persons.LastName
于 2012-11-08T18:24:15.073 に答える
0

まず、会社のすべての連絡先名を 1 つの列にまとめます。データベースが SQL Server であると仮定して、共通テーブル式を使用して単一列の連絡先リストを格納しています。CTE が構築されたら、Clients テーブルと結合して ContactNames を取得します。FOR XML は、行を連結するために使用されます。

WITH CTEContactList(ClientID,ContactNames) 
AS
(

 SELECT c1.ClientID,
        Names = SUBSTRING(( SELECT ', ' + c2.ContactName
                            FROM Contacts c2
                            WHERE c1.ClientID = c2.ClientID
                            FOR XML PATH ('')),3,8000 ))
 FROM Contacts c1
 GROUP BY c1.ClientID

 )

SELECT 
       cl.ID,
       cl.CompanyName,
       cl.Address,
       ctelist.ContactNames

FROM Clients cl
INNER JOIN CTEContactList ctelist
ON cl.ID = cteList.ClientID
于 2012-11-08T19:05:49.063 に答える
0

DBMS を指定しなかったため、PostgreSQL を想定しています。

select string_agg(ct.contactName, ', '), cl.companyname, cl.address
from contacts ct
  join clients cl on cl.id = ct.clientId
group by cl.companyname, cl.address
于 2012-11-08T23:04:51.373 に答える