Как исправить эту ошибку 'Столбец' DistrictID 'был указан несколько раз для' piv ' - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу показать имя инспектора, должность инспектора, район и проект с инспекцией, проведенной инспектором в соответствии с месяцами, для которых я использую сводную таблицу, но получаю "Столбец" DistrictID "был указан несколько раз для"PIV.»эта ошибка ...

Пожалуйста, помогите мне преодолеть эту ошибку

Declare @SQLQuery nvarchar(MAX)
If(OBJECT_ID('tempdb..#TBL1') Is Not Null)
Begin
    Drop Table #TBL1
End

CREATE TABLE #TBL1
(

 ID int,
InspPost nvarchar (MAX),
InspPostHin nvarchar(MAX)

)
SET @SQLQuery ='INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (1, N''Child Development Project Officer'', N''??? ????? ???????? ?????????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (2, N''Lady Superviser'', N''????? ????????????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (3, N''Other'', N''???? ?????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (4, N''District Program Officer'', N''???? ????????? ?????????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (5, N''J.P.C/State Level Officer'',N''??.??.??../???? ???????? ????? ?????? ???????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (6, N''S.P.M.U/Technical Consultant'', N''??.??..??.??. - ?????? ???????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (7, N''District Coordinator'', N''???? ???????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (8, N''Project Coordinator'', N''?????? ???????'')
INSERT into #TBL1 ([ID], [InspPost], [InspPostHin]) VALUES (9, N''Swasth Bharat Prerak'', N''?????? ???? ??????'')'

exec (@SQLQuery)
select * from 
(
    select Districtmaster.DistrictID,ProjectMaster.ProjectID,Districtmaster.DistrictNameHn,ProjectMaster.ProjectNameHn from Districtmaster Districtmaster 
    inner join ProjectMaster ProjectMaster on Districtmaster.DistrictID=ProjectMaster.DistID

) a1
inner join
(
  select Supervision_Checklist.ID,Supervision_Checklist.Inspector_Name,
  Supervision_Checklist.DistrictID,Supervision_Checklist.ProjectID,
  Supervision_Checklist.Inspector_Type,(#TBL1.InspPost) as inptype ,Supervision_Checklist.Month
  from Supervision_Checklist Supervision_Checklist 
  inner join #TBL1 #TBL1 
  on Supervision_Checklist.Inspector_Type=#TBL1.ID
) src on a1.DistrictID=src.DistrictID and a1.ProjectID=src.ProjectID 
pivot (count(id) for Month in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) piv

Я хочу получить результат следующим образом ...

введите описание изображения здесь

1 Ответ

0 голосов
/ 08 апреля 2019

A PIVOT эффективно выполняет GROUP BY для всех столбцов, которые в настоящее время находятся в наборе результатов и которые не упомянуты в сводке.

Если вы немного присоединились, весьма вероятно (как здесь), что у вас будет несколько столбцов с одинаковым именем (DistrictID). Даже если мы знаем, что оба значения DistrictID равны в каждой строке, оптимизатор этого не делает, и генерирует эту ошибку.

Нам нужно проецировать столбцы, которые мы не хотим включать в эту операцию группировки. Но нет никакого удобного способа выразить это "inline". Нам нужно иметь предложение SELECT, и нам нужно, чтобы PIVOT находился на «другой стороне» этого предложения SELECT.

Как правило, мы делаем это с помощью подзапроса или CTE:

;With AllResults as (
    select
      id,
      month,
      /* We cannot use * here. We need only those columns needed by the pivot
         or which should appear in the final result */
    from 
    (
        select Districtmaster.DistrictID,ProjectMaster.ProjectID,Districtmaster.DistrictNameHn,ProjectMaster.ProjectNameHn from Districtmaster Districtmaster 
        inner join ProjectMaster ProjectMaster on Districtmaster.DistrictID=ProjectMaster.DistID

    ) a1
    inner join
    (
      select Supervision_Checklist.ID,Supervision_Checklist.Inspector_Name,
      Supervision_Checklist.DistrictID,Supervision_Checklist.ProjectID,
      Supervision_Checklist.Inspector_Type,(#TBL1.InspPost) as inptype ,Supervision_Checklist.Month
      from Supervision_Checklist Supervision_Checklist 
      inner join #TBL1 #TBL1 
      on Supervision_Checklist.Inspector_Type=#TBL1.ID
    ) src on a1.DistrictID=src.DistrictID and a1.ProjectID=src.ProjectID 
)
select *
from AllResults
pivot (count(id) for Month in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) piv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...