Таблица данных отношения к таблице плоских данных в sql

Table Fan
-----------------------
| FanId | Name | Info |
-----------------------
| 17111 | Fan1 | Info1|
-----------------------  
| 17112 | Fan2 | Info2|
-----------------------
1:m
Table ProfileFan
----------------------------------
| Id | LinkedInProfileId | FanId |
----------------------------------
| 1111    | 1          | 17111   |
----------------------------------
| 1112    | 2          | 17111   |
----------------------------------
| 1113    | 1          | 17112   |
----------------------------------
| 1114    | 2          | 17112   |
----------------------------------
m:1
Table LinkedInProfile
--------------------------
| LiId | Name | Client    |
--------------------------
| 1    | Linked1 | Client1|
--------------------------
| 2    | Linked2 | Client1 |
--------------------------

Мне нужно, чтобы данные из этих таблиц отношений были экспортированы в CSV. Поэтому я делаю процедуру для работы и планирую ее запуск каждый час.

Загвоздка в том, что мне нужно вставить данные из запроса для одного вентилятора в одну строку.

ExportToCsv Table
--------------------------------------------------------------------
| FanName | FanInfo  | LinkedInProfile1| LinkedInProfile2 | Client |
--------------------------------------------------------------------
| Fan1    | FanInfo1 | Linked1(1111)   |  Linked2(1112)  | Client1 |
--------------------------------------------------------------------
| Fan2    | FanInfo2 | Linked1(1113)   |  Linked2(1114)  | Client1 |
--------------------------------------------------------------------

Пока что мой запрос генерирует строки для каждого ProfileFanId.

BEGIN
DECLARE @ProfileFanId INT
SET @ProfileFanId=0
SELECT TOP (1)  @ProfileFanId =[dbo].[ExportCSV].ProfileFanId
    FROM [dbo].[ExportCSV] Order by ProfileFanId desc

IF @StatementType = 'Insert' 

INSERT INTO ExportCSV (FanId, SNUrl, FullName, FirstName, LastName, Company, JobTitle, [ExperienceDescription], [FANProfileLocation], [CompanyDescription], [CompanyIndustry], [CompanyLocationCity],
[CompanyLocationCountry], [NumberOfEmployees], [CompanySpecialities], [CompanyLiURL], [CompanyDomain], [TwitterHandles], [EMailAddress] ,[TelephoneNumber], ClientName1, CreatedAt, ProfileFanId )


SELECT DISTINCT B.LinkedInProfile ,B.SNUrl ,B.FullName, B.FirstName, B.LastName,B.Organization1,B.JobTitle,B.ExperienceDescr,B.ProfileLocation,B.OrganizationDescription1,B.Organization1Industry,
B.OrganizationCity1,B.OrganizationCountry1,B.Organization1Size, B.OrganizationSpecialities1, B.OrganizationLIID1,B.OrganizationDomain1, B.Twitter, B.Email, B.Phone, C.Name, SYSDATETIME(), A.Id, B.Id --,c.EmailResponseStatusId,c.FanStatusId,c.BatchId, n.DeliveryActionId, n.LoggedAt, f.ActivityId,f.Created
FROM ProfileFan A 
INNER JOIN Fan B ON A.FanId = B.Id
INNER JOIN LinkedInProfile C ON A.ProfileId = C.Id
--INNER JOIN Batch D ON A.BatchId = D.Id
where A.Id>@ProfileFanId

--------------------------------------------------------------------
| FanName | FanInfo  | LinkedInProfile1| LinkedInProfile2 | Client |
--------------------------------------------------------------------
| Fan1    | FanInfo1 | Linked1(1111)   |                  | Client1|
--------------------------------------------------------------------
| Fan1    | FanInfo1 | Linked2(1112)   |                  | Client1|
--------------------------------------------------------------------
| Fan2    | FanInfo2 | Linked1(1113)   |                  | Client1|
--------------------------------------------------------------------
| Fan2    | FanInfo2 | Linked2(1114)   |                  | Client1|
--------------------------------------------------------------------

Любая идея, как получить желаемый результат, приветствуется. Заранее спасибо!

Сколько таких LinkedInProfileN у вас может быть для одной фан-записи? Если у вас есть 10 000 для одного поклонника, вы хотите иметь 10 000 столбцов в файле CSV?

MarcinJ 03.04.2019 10:53

1 Фанат может иметь много ProfileFans, определяемых LinkedInProfiles, которых много. ex 2 profileFans создаются для 2 LinkedInProfiles, но имеют только 1 запись в Fan Table

nightowl 03.04.2019 10:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вам нужно использовать PIVOT с динамическими столбцами.

Взгляните на это для ознакомления с динамическим PIVOT: https://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

Я смоделировал ваш пример в следующих запросах:

CREATE TABLE Fan(FanId int, Name varchar(100), Info varchar(100));

INSERT INTO Fan VALUES (17111,'Fan1','Info1'),(17112,'Fan2','Info2');

CREATE TABLE LinkedInProfile(LiId int, Name varchar(100), Client varchar(100));

INSERT INTO LinkedInProfile VALUES (1,'Linked1','Client1'),(2,'Linked2','Client1');

CREATE TABLE ProfileFan(Id int, LinkedInProfileId int, FanId int);

INSERT INTO ProfileFan VALUES (1111,1,17111),(1112,2,17111),(1113,1,17112);

DECLARE @columns NVARCHAR(MAX), @columns1 NVARCHAR(MAX), @sql NVARCHAR(MAX);

SELECT @columns = STUFF((
            SELECT DISTINCT ',' + 'LinkedInProfile' + CAST(LinkedInProfileId AS VARCHAR) FROM ProfileFan
            FOR XML PATH('')
            ), 1, 1, '')
FROM ProfileFan;

SELECT @columns1 = STUFF((
            SELECT DISTINCT ',' + '[LinkedInProfile' + CAST(LinkedInProfileId AS VARCHAR) + ']' FROM ProfileFan
            FOR XML PATH('')
            ), 1, 1, '')
FROM ProfileFan;



SET @sql = 'SELECT Name, Info,' + @columns + ' FROM
(
  SELECT CONCAT(lip.Name,''('',pf.Id,'')'') AS val, f.Name as ''Name'', f.Info as ''Info'' , CONCAT(''LinkedInProfile'',pf.LinkedInProfileId) as LipId 
  FROM Fan f
  LEFT JOIN
  ProfileFan pf
  ON
  f.FanId = pf.FanId
  LEFT JOIN
  LinkedInProfile lip
  ON
  pf.LinkedInProfileId = lip.LiId

) AS src
PIVOT
(
  MAX(src.val) FOR src.LipId IN ('+ @columns1
  + ')
) AS p;';

EXEC sp_executesql @sql;

Этот динамический запрос @sql даст результат в виде:

SELECT Name, Info, LinkedInProfile1, LinkedInProfile2 FROM
(
  SELECT CONCAT(lip.Name,'(',pf.Id,')') AS val, f.Name as 'Name', f.Info as 'Info', CONCAT('LinkedInProfile',pf.LinkedInProfileId) as LipId 
  FROM Fan f
  LEFT JOIN
  ProfileFan pf
  ON
  f.FanId = pf.FanId
  LEFT JOIN
  LinkedInProfile lip
  ON
  pf.LinkedInProfileId = lip.LiId

) AS src
PIVOT
(
  MAX(src.val) FOR src.LipId IN ([LinkedInProfile1],[LinkedInProfile2])
) AS p;

Набор результатов:

    Name    Info    LinkedInProfile1    LinkedInProfile2
1   Fan1    Info1   Linked1(1111)   Linked2(1112)
2   Fan2    Info2   Linked1(1113)   NULL
Name Info LinkedInProfile1 LinkedInProfile2 Fan1 Info1 Linked1(1111) Linked2(1112) Fan2 Info2 Linked1(1113) Linked2(1114) Но я должен получить это в столбце LinkedInProfile Linked1 вместо Linked2. Не могли бы вы обновить свой запрос, я не знаю, где я его упустил?
nightowl 03.04.2019 12:45

Я обновил его сейчас. Небольшая ошибка в условии левого соединения. Вы также можете найти симуляцию здесь: rextester.com/ZQNQK96212

sabhari karthik 03.04.2019 12:57

Пожалуйста, перейдите по этой ссылке для расширения этого вопроса связь

nightowl 04.04.2019 14:43

Другие вопросы по теме