Включить иерархию менеджеров

Мне дали этот код, который в настоящее время ранжирует колл-центры на основе заданных критериев. Мне было поручено изменить этот рейтинг с Центра на Ассоциированного директора (AKA AD, Manager, BottomUpLevel02).

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

Вот код:

SET NOCOUNT ON 
DECLARE @StartDate SMALLDATETIME, 
        @EndDate SMALLDATETIME 
SET @StartDate = '2012/07/01' 
SET @EndDate = '2012/07/31' 

IF OBJECT_ID('tempdb..#ACSResults') IS NOT NULL DROP TABLE #ACSResults 

CREATE TABLE #ACSResults (AreaID VARCHAR(4), Location VARCHAR(50), 
                          MonthName VARCHAR(6),
                          RepResolve FLOAT, ERP FLOAT)
INSERT INTO #ACSResults 
SELECT a.area, a.location,
a.monthname,
CASE WHEN SUM(CASE WHEN a.RepResolve IN ('1','0') 
                        THEN 1 
                   ELSE 0 END) = 0 
          THEN NULL  
          ELSE CAST(SUM(CASE WHEN a.RepResolve = '1' 
                                  THEN 1 
                             ELSE 0 END)AS FLOAT) / CAST(SUM(CASE WHEN a.RepResolve IN ('1','0') 
                                                                       THEN 1 
                                                                  ELSE 0 END) AS FLOAT) END AS REPRESOLVE,
CASE WHEN SUM(CASE WHEN a.ERP IN ('0','1','2','3','4','5','6','7','8', '9', '10') 
                        THEN 1 
                   ELSE 0 END) = 0 
          THEN NULL 
     ELSE (CAST(SUM(CASE WHEN a.ERP IN ('8', '9', '10') 
                              THEN 1 
                         ELSE 0 END) AS FLOAT) / CAST(SUM(CASE WHEN a.ERP in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10') 
                                                                    THEN 1 
                                                               ELSE 0 END) AS FLOAT))END AS ERP

FROM (SELECT CASE WHEN vl.virtuallocationtypeid =13 
                       THEN 'PP'
                  WHEN eh.PeopleSoftDepartmentID IN ('2922', '9050', '9136', '9130','9134','9135', '9137', '9060') 
                       THEN 'FS'
                  WHEN eh.PeopleSoftDepartmentID ='2390' 
                       THEN 'CMO'
                  WHEN eh.virtuallocationtypeid = 3 
                  OR eh.peoplesoftDepartmentid IN ('9165', '9166','9157','9167','<<OSVBSC>>') 
                       THEN 'BSC'
                  WHEN (eh.virtuallocationid IN ('111', '113', '114', '115', '116', '118', '119', '120', '122', '123') 
                        AND acs.OfferDate  < '04/01/2011') 
                  OR (eh.virtuallocationid IN ('116','120','123') 
                      AND acs.OfferDate  >= '04/01/2011') 
                        THEN 'SPC2'
                  WHEN (eh.virtuallocationid IN ('112', '121', '110') 
                        AND acs.OfferDate  >= '07/01/2011') 
                       THEN 'SPC2'
                  WHEN (eh.virtuallocationid IN ('99') 
                        AND acs.OfferDate < '07/01/2011') 
                        AND eh.PeopleSoftDepartmentID IN ('9030', '9080', '9355', '9040', '<<OSCCALTECH>>', '<<WDTSMO>>', '9195','<<OSVTS>>') 
                       THEN 'SPC2'
                  WHEN eh.EmployeeTypeID = 'V' 
                       THEN 'SPC'
                  WHEN vl.virtuallocationtypeid =14 
                       THEN 'SPC2'
                  WHEN (eh.virtuallocationID IS NULL 
                        AND eh.AreaId IS NULL) 
                       THEN eh.PeopleSoftAreaID 
                  WHEN eh.virtuallocationID IS NULL 
                       THEN eh.AreaID 
                       ELSE vl.AreaId END AS Area,
             CASE WHEN eh.VirtualLocationID = 102 
                       THEN 'HQ Quality - GSC'
                  WHEN eh.peoplesoftDepartmentid IN ('9165', '9166','9167') 
                       THEN 'GSC'
                  WHEN eh.peoplesoftdepartmentid ='<<OSVAOL>>' 
                  AND eh.virtuallocationid =64  
                       THEN 'ALORICA AOL'
                  WHEN (eh.virtuallocationid IN ('99', '148')
                        AND eh.PeopleSoftDepartmentID IN ('9030', '9080', '9355', '9040', '<<OSCCALTECH>>', '<<WDTSMO>>', '9195','<<OSVTS>>')) 
                       THEN 'Wichita Falls (WDS) - Tech'
                  WHEN eh.virtuallocationID IS NULL 
                  OR vl.VirtualLocationTypeID = 4 
                       THEN 'Others'
                  ELSE vl.VirtualLocationDescription END AS Location,
             CASE WHEN eh.PeopleSoftDepartmentID IN ( '9180', '<<WEBILING>>','<<OSVSPN>>') 
                       THEN 'Bilingual'
                  WHEN eh.PeopleSoftDepartmentID IN ( '9150', '9440', '9370', '9260', '9330', '9460','9155','9215','9157','9175','<<OSVBSC>>') 
                       THEN 'BSC'
                  WHEN eh.PeopleSoftDepartmentID IN ( '9395', '9010', '9341', '9340', '9450', '9131', '9025', '10014901', '<<SO_WEVIS>>', '<<WE_MWVIS>>', '<<WEVIS>>', '<<NEVIS>>', '<<OSCCALTEL>>', '<<SOVIS>>', '<<NE_MWVIS>>', '<<MWVIS>>', '<<OSVCS>>') 
                       THEN 'Care'
                  WHEN eh.PeopleSoftDepartmentID IN ('9030', '9080', '9355', '9040', '<<OSCCALTECH>>', '<<WDTSMO>>', '9195','<<OSVTS>>' ) 
                       THEN 'Tech'
                  WHEN eh.PeopleSoftDepartmentID IN ('<<AOL_WEVIS>>', '<<OSVAOL>>') 
                       THEN 'AOL'
                  WHEN eh.peoplesoftdepartmentid IN ('<<OSVCS_TCS>>', '<<OSVOB_TCS>>')
                       THEN 'New Hire Transition'
                  WHEN eh.PeopleSoftDepartmentID = '9390' 
                       THEN 'EPP'
                  WHEN eh.PeopleSoftDepartmentID = '9120' 
                       THEN 'ERT'
                  WHEN eh.PeopleSoftDepartmentID = '9190' 
                       THEN 'IRT'
                  WHEN eh.PeopleSoftDepartmentID = '9085' 
                       THEN 'Bilingual Tech'
                  WHEN eh.PeopleSoftDepartmentID IN ('9490', '<<LNP>>','<<OSVLNP>>')
                       THEN 'LNP'
                  WHEN eh.PeopleSoftDepartmentID = '9070' 
                       THEN 'Retention'
                  WHEN eh.PeopleSoftDepartmentID = '9115' 
                       THEN 'GLOBAL'
                  WHEN eh.PeopleSoftDepartmentID IN ('<<ONEBILL>>', '<<OSVOB>>') 
                       THEN 'Onebill'
                  WHEN eh.peoplesoftdepartmentid = '<<PPCARE>>' 
                       THEN 'Prepaid Care'
                  WHEN eh.peoplesoftdepartmentid = '<<PPTECH>>' 
                       THEN 'Prepaid Tech'
                  ELSE 'Other' END AS DeptGroup,
             psd.PeopleSoftDepartmentDescription AS Dept, 
             acs.IVRCallID, 
             acs.OfferDate, 
             acs.EmployeeID,
             acs.ACSSUserID, 
             Cast(acs.DidRepResolve as Float) As RepResolve,
             acs.Question1 AS FCR, 
             acs.Question2 AS ERP, 
             acs.Question3 AS NPS, 
             acs.ACSSCallID,
             month (acs.Offerdate) AS MonthName

      FROM dbCustomerSurvey.Detail.vwAfterCallSurvey acs 
      LEFT JOIN dbEmployee.Summary.vwEmployeeHistory eh 
                ON acs.EmployeeID = eh.EmployeeID 
                AND acs.OfferDate BETWEEN eh.StartDate 
                AND eh.EndDate 
      LEFT JOIN dbEmployee.Config.vwName Rep 
                ON eh.EmployeeID = Rep.EmployeeID 
      LEFT JOIN dbEmployee.Config.vwName Sup 
                ON eh.BottomUp01ID = Sup.EmployeeID
      LEFT JOIN dbEmployee.Config.vwName Mgr 
                ON eh.BottomUp02ID = Mgr.EmployeeID
      LEFT JOIN dbEmployee.Config.vwName Dir 
                ON eh.BottomUp03ID = Dir.EmployeeID
      LEFT JOIN dbEmployee.Config.vwVirtualLocation vl 
                ON eh.VirtualLocationID = vl.VirtualLocationID 
      LEFT JOIN dbEmployee.Config.vwDepartment d 
                ON eh.DepartmentID = d.DepartmentID 
      LEFT JOIN dbEmployee.Config.vwPeopleSoftDepartment psd
                ON eh.PeopleSoftDepartmentID = psd.PeopleSoftDepartmentID
      WHERE acs.CurrentStatus IN ('Completed', 'COMP') 
            AND acs.surveytype IN ('ACS_FCR_Rep_Perform', 'ACS_FCR_Rep_Perform-prepaid', 'ACS_Rep_Perform_BSC2', 'ACS_Rep_Perform_Gov') 
            AND acs.OfferDate BETWEEN @StartDate AND @EndDate) a 

WHERE a.Area IN ('WE', 'mw','ne','so') 
      AND a.Location NOT IN ('West Area Staff - CS', 'Northeast Area Staff - CS', 'Midwest Area Staff - CS', 'Others', 'West Area Finance - CS', 'Midwest Area Marketing, Sales, & Training', 'South Area Staff - CS', 'Midwest Area Finance - CS', 'Bellevue - CS')
      AND a.deptgroup in ('aol','bilingual','Bilingual Tech','care','global','lnp', 'onebill','other','retention','tech', 'new hire transition') 

GROUP BY a.area, a.location, a.monthname

-- Повторить таблицу

IF OBJECT_ID('tempdb..#HRRep')  IS NOT NULL DROP TABLE #HRRep 

CREATE TABLE #HRRep (AreaID VARCHAR(4), Location VARCHAR(50), 
                     MonthName VARCHAR(6), 
                     HourRepeatPercent FLOAT)
INSERT INTO #HRRep (AreaID, Location, MonthName, HourRepeatPercent) 
SELECT eh.AreaID, vl.VirtualLocationDescription, 
       MONTH (acs.statdate) AS MonthName,

       CAST(SUM(acs.Repeats2Hr)as FLOAT) / NULLIF(SUM(acs.Calls2Hr), 0) as 'HourRepeatPercent'

FROM dbReportSummary.ReportSummary.vwRepeatCalls2Hr acs WITH (NOLOCK)
LEFT JOIN dbEmployee.Summary.vwEmployeeHistory eh WITH (NoLOCK) 
          ON acs.EmployeeID = eh.EmployeeID 
          AND acs.StatDate BETWEEN eh.StartDate AND eh.EndDate 
LEFT JOIN dbEmployee.Config.vwVirtualLocation vl 
          ON eh.VirtualLocationID = vl.VirtualLocationID 
LEFT JOIN dbEmployee.Config.vwDepartment d 
          ON eh.DepartmentID = d.DepartmentID 
LEFT JOIN dbEmployee.Config.vwPeopleSoftDepartment psd 
          ON eh.PeopleSoftDepartmentID = psd.PeopleSoftDepartmentID

WHERE acs.StatDate BETWEEN @StartDate AND @EndDate
      AND eh.PeopleSoftDepartmentID IN ('9180', '<<WEBILING>>','<<OSVSPN>>', '9150', '9440', '9370', '9260', '9330', '9460','9155','9215','9157','9175','<<OSVBSC>>', '9395', '9010', '9341', '9340', '9450', '9131', '9025', '10014901', '<<SO_WEVIS>>', '<<WE_MWVIS>>', '<<WEVIS>>', '<<NEVIS>>', '<<OSCCALTEL>>', '<<SOVIS>>', '<<NE_MWVIS>>', '<<MWVIS>>', '<<OSVCS>>', '9030', '9080', '9355', '9040', '<<OSCCALTECH>>', '<<WDTSMO>>', '9195','<<OSVTS>>', '<<AOL_WEVIS>>', '<<OSVAOL>>', '<<OSVCS_TCS>>', '<<OSVOB_TCS>>'    , '9390', '9120', '9190', '9085', '9490', '<<LNP>>', '<<OSVLNP>>', '9070', '9115', '<<ONEBILL>>', '<<OSVOB>>', '<<PPCARE>>', '<<PPTECH>>')
      AND eh.AreaID IN ('MW', 'NE', 'SO', 'WE')
      AND vl.VirtualLocationDescription NOT IN ('West Area Staff - CS', 'Northeast Area Staff - CS', 'Midwest Area Staff - CS', 'Others', 'West Area Finance - CS')
AND eh.Titleid IN ('1','2','3','509') 

GROUPBY  eh.AreaID, vl.VirtualLocationDescription, MONTH (acs.statdate)

-- (?) --

SELECT a.Location, a.RepResolve, a.RRRank, a.ERP, a.ERPRank,a.HourRepeatPercent,
       a.RepeatRank, (a.RRRank + a.ERPRank+a.RepeatRank) as 'Total Rank Points', 
       RANK() OVER(ORDER BY (a.RRRank + a.ERPRank+a.RepeatRank) ASC, a.RepResolve DESC) AS 'Overall Rank'
FROM (SELECT a.Location, a.RepResolve, 
             RANK() OVER(ORDER BY a.RepResolve DESC) AS RRRank, a.ERP, 
             RANK() OVER(ORDER BY a.ERP DESC) AS ERPRank, b.HourRepeatPercent, 
             RANK() OVER(ORDER BY b.HourRepeatPercent ASC) AS RepeatRank
      FROM #ACSResults AS A
      LEFT JOIN #HRRep AS B 
                ON a.areaid = b.areaid 
                AND a.monthname = b.monthname 
                AND a.location = b.location) a
GROUP BY a.Location, a.RepResolve, a.RRRank, a.ERP, a.ERPRank,a.HourRepeatPercent,
         a.RepeatRank, (a.RRRank + a.ERPRank + a.RepeatRank)

Я продолжаю получать ошибки о том, что предложение select не соответствует предложению вставки, когда я пытаюсь добавить AD в микс. Кто-нибудь может указать области, которые необходимо изменить, чтобы включить AD?

РЕДАКТИРОВАТЬ: мне удалось успешно добавить столбец AD! Новая проблема: результаты немного не те. Раньше, когда результаты ранжировались в зависимости от местоположения, каждому отдельному местоположению присваивался рейтинг на основе общего количества баллов. Это было чисто, и цифры складывались. Теперь есть дублирующиеся объявления, и ранжирование обратное (наименьшее количество общих рейтинговых очков указано как 1-е место).

Я просто добавил столбец AD в оператор INSERT и операторы select. Может ли кто-нибудь сказать мне, помимо добавления столбца AD в соответствующие места запроса, должен ли я изменять какие-либо операции или функции запроса, чтобы отразить истинный рейтинг для данного диапазона дат? Пожалуйста, не стесняйтесь просить разъяснений по любой части этого. Заранее благодарим за любую помощь, которую вы можете предоставить.


person ciw916    schedule 15.11.2012    source источник
comment
В компьютерном программировании есть старая поговорка, что вы должны писать все так, как если бы следующий человек, который увидит это, был маньяком-убийцей с топором и вашим адресом. Думаю, тебе стоит купить топор.   -  person Laurence    schedule 15.11.2012
comment
ха-ха, я согласен ... увы, это то, с чем мне осталось работать в данный момент. Блех   -  person ciw916    schedule 15.11.2012
comment
Стоит отметить, что большинство СУБД, поддерживающих бит CREATE TABLE FROM SELECT, будут брать имена и определения столбцов из выбранных столбцов, поэтому вам не нужно явно перечислять их. Очевидно, что такие вещи, как первичные ключи (и, как правило, ограничения) не могут быть переданы, но это упрощает определение таблицы.   -  person Clockwork-Muse    schedule 15.11.2012
comment
Спасибо, Заводная Муза. Я использую SQL Server 2005, поэтому ваше утверждение применимо. Я ценю совет.   -  person ciw916    schedule 15.11.2012
comment
Не уверен насчет топора, но да... Вероятно, ситуацию можно было бы улучшить, добавив пару таблиц сопоставления (чтобы решить проблему CASE WHEN <somenumber> THEN <some string title>), даже если бы это добавило соединение. На самом деле я не уверен, что все правильно освещено, это довольно неприятно. Также, вероятно, могут быть полезны какие-то контрольные таблицы (например, «включить все отделы в эту таблицу»). И, как всегда, диапазоны дат следует искать с эксклюзивными верхними границами (<), не оператором BETWEEN, особенно на сервере SQL.   -  person Clockwork-Muse    schedule 15.11.2012
comment
Заводная Муза, ты кладезь знаний. Я собираюсь назвать немного информации о диапазоне дат. Мой руководитель научил меня методу между утверждениями! Я покажу ей этот лакомый кусочек, когда увижу ее в следующий раз. Я собираюсь изучить и другие методы, которые вы перечислили. Благодарю вас!   -  person ciw916    schedule 16.11.2012


Ответы (3)


РЕДАКТИРОВАТЬ: мне удалось успешно добавить столбец AD! Новая проблема: результаты немного не те. Раньше, когда результаты ранжировались в зависимости от местоположения, каждому отдельному местоположению присваивался рейтинг на основе общего количества баллов. Это было чисто, и цифры складывались. Теперь есть дублирующиеся объявления, и ранжирование обратное (наименьшее количество общих рейтинговых очков указано как 1-е место).

Я просто добавил столбец AD в оператор INSERT и операторы select. Может ли кто-нибудь сказать мне, помимо добавления столбца AD в соответствующие места запроса, должен ли я изменять какие-либо операции или функции запроса, чтобы отразить истинный рейтинг для данного диапазона дат? Пожалуйста, не стесняйтесь просить разъяснений по любой части этого. Заранее благодарим за любую помощь, которую вы можете предоставить.

Вам понадобятся столбцы AD в обеих ваших временных таблицах (#ACS и ##HRRep), и каждая из них (например, INSERT INTO.... SELECT FROM) должна иметь столбец AD в GROUP BY. Затем ваш окончательный SELECT должен будет объединить две таблицы в столбце AD, а также другие столбцы, уже находящиеся в выражении соединения.

Я подозреваю, что вам не нужна GROUP BY в финальном SELECT, так как (я думаю) в двух таблицах уже есть результаты, объединенные по ареайду, местоположению и т. д., а RANK() является однократным. функция строки, а не агрегат, такой как SUM:

LEFT JOIN #HRRep AS B 
                ON a.areaid = b.areaid 
                AND a.monthname = b.monthname 
                AND a.location = b.location) a
/* Probably don't need this bit
GROUP BY a.Location, a.RepResolve, a.RRRank, a.ERP, a.ERPRank,a.HourRepeatPercent,
         a.RepeatRank, (a.RRRank + a.ERPRank + a.RepeatRank)
But this bit: */
ORDER BY (a.RRRank+a.EPRank+a.RepeatRank) DESC

Предложение Лоуренса создать таблицу сопоставления (он осмелился погрузиться в «отвратительность» внутри первого набора) великолепна, поскольку она изолирует «отвратительность» в одном месте.

person sebt    schedule 16.11.2012
comment
Боже мой... Клянусь, в какой-то момент я научился этому. Большое спасибо, себ. Похоже, я готов идти! Хорошего дня! - person ciw916; 16.11.2012

Чтобы воплотить в жизнь идеи Clockwork Muse. Если вам разрешено создавать таблицы, начните с (замените nvarchars тем, что есть в вашей базе данных)

Create Table dbo.DepartmentGroupLookup (
  PeopleSoftDepartmentID nvarchar(30) Primary Key Not Null,
  DeptGroup nvarchar(30) not null
)

Insert Into dbo.DepartmentGroupLookup (PeopleSoftDepartmentID, DeptGroup) Values
  ('9180', 'Bilingual'), ('<<WEBILING>>', 'Bilingual'), ..., ('9150', 'BSC'), ... etc

Create Function dbo.LookupLocation(
  @VirtualLocationID as int, 
  @VirtualLocationDescription nvarchar(30),
  @VirtualLocationTypeID int,
  @PeopleSoftDepartmentID nvarchar(30)
) Returns nvarchar(30) As
Begin
  Return Case 
    When @VirtualLocationID = 102 Then 'HQ Quality - GSC'
    When @PeopleSoftDepartmentID In ('9165', '9166','9167') Then 'GSC'
    When @PeopleSoftDepartmentID ='<<OSVAOL>>' And @VirtualLocationID = 64 Then 'ALORICA AOL'
    When @VirtualLocationID In ('99', '148') And 
      @PeopleSoftDepartmentID In (
        '9030', '9080', '9355', '9040', '<<OSCCALTECH>>', 
        '<<WDTSMO>>', '9195','<<OSVTS>>'
      ) Then 'Wichita Falls (WDS) - Tech'
    When @VirtualLocationID Is Null Or @VirtualLocationTypeID = 4 Then 'Others'
    Else @VirtualLocationDescription 
    End
 End

Сделайте то же самое для поиска области, теперь ваш первый внутренний запрос становится

Select
  dbo.LookupArea(eh.virtuallocationID, v1.virtuallocationtypeid, vl.AreaId,  eh.PeopleSoftAreaID,
      eh.PeopleSoftDepartmentID, acs.OfferDate, eh.EmployeeTypeID) As Area, -- There may be other dependencies
  dbo.LookupLocation(eh.VirtualLocationID, vl.VirtualLocationDescription,
      vl.VirtualLocationTypeID, eh.peoplesoftDepartmentid) As Location,
  IsNull(dgl.DeptGroup, 'Other') AS DeptGroup,
  psd.PeopleSoftDepartmentDescription AS Dept, 
  acs.IVRCallID, 
  acs.OfferDate, 
  acs.EmployeeID,
  acs.ACSSUserID, 
  Cast(acs.DidRepResolve as Float) As RepResolve,
  acs.Question1 AS FCR, 
  acs.Question2 AS ERP, 
  acs.Question3 AS NPS, 
  acs.ACSSCallID,
  Month(acs.Offerdate) AS MonthName
From
  dbCustomerSurvey.Detail.vwAfterCallSurvey acs 
    Left Outer Join
  dbEmployee.Summary.vwEmployeeHistory eh 
    On acs.EmployeeID = eh.EmployeeID And acs.OfferDate Between eh.StartDate And eh.EndDate 
    Left Outer Join
  dbEmployee.Config.vwName Rep 
    On eh.EmployeeID = Rep.EmployeeID 
    Left Outer Join 
  dbEmployee.Config.vwName Sup 
    On eh.BottomUp01ID = Sup.EmployeeID
    Left Outer Join
  dbEmployee.Config.vwName Mgr 
    On eh.BottomUp02ID = Mgr.EmployeeID
    Left Outer Join
  dbEmployee.Config.vwName Dir 
    On eh.BottomUp03ID = Dir.EmployeeID
    Left Outer Join
  dbEmployee.Config.vwVirtualLocation vl 
    On eh.VirtualLocationID = vl.VirtualLocationID 
    Left Outer Join
  dbEmployee.Config.vwDepartment d 
    On eh.DepartmentID = d.DepartmentID 
    Left Outer Join
  dbEmployee.Config.vwPeopleSoftDepartment psd
    On eh.PeopleSoftDepartmentID = psd.PeopleSoftDepartmentID
    Left Outer Join
  dbo.DepartmentGroupLookup dgl
    On eh.PeopleSoftDepartmentID = dgl.PeopleSoftDepartmentID
Where 
 acs.CurrentStatus In ('Completed', 'COMP') And
 acs.surveytype In (
     'ACS_FCR_Rep_Perform', 'ACS_FCR_Rep_Perform-prepaid',
     'ACS_Rep_Perform_BSC2', 'ACS_Rep_Perform_Gov'
 ) And
 acs.OfferDate Between @StartDate And @EndDate

Цель состоит в том, чтобы продолжать упрощать (или, по крайней мере, убирать вещи из поля зрения) таким образом, пока не станет возможным понять, что происходит.

person Laurence    schedule 15.11.2012
comment
Это гораздо более упорядочено, чем то, на что я смотрю. Спасибо, что нашли время, Лоуренс. Будучи довольно начинающим кодером, я предположил, что хаос, присутствующий в коде, на который ссылаются, время от времени можно ожидать. Но чтобы избежать топора, главное — простота! - person ciw916; 16.11.2012

Лоуренс прав.

Отступы — мой (и всеобщий) друг, когда код SQL начинает выглядеть вот так. Если производный набор имеет отступ, легче увидеть, где начинается и заканчивается его определение:

SELECT some columns 
FROM
     (lots of hideous code) SetA
WHERE
    Things AND
    More Things

Я вырезал большую часть отвратительности из фрагмента кода, с которым вам не повезло иметь дело:

CREATE TABLE #ACSResults (AreaID VARCHAR(4), Location VARCHAR(50),MonthName VARCHAR(6), RepResolve FLOAT, ERP FLOAT)
INSERT INTO #ACSResults 
  SELECT 
-- ColListStart
a.area,
a.location,
a.monthname,

 CASE WHEN SUM(CASE WHEN a.RepResolve IN ('1','0') THEN 1 ELSE 0 END) = 0 THEN NULL  ELSE CAST(SUM(CASE WHEN a.RepResolve = '1' THEN 1 ELSE 0 END)AS FLOAT) / CAST(SUM(CASE WHEN a.RepResolve IN ('1','0') THEN 1 ELSE 0 END) AS FLOAT) END AS REPRESOLVE,
CASE WHEN SUM(CASE WHEN a.ERP IN ('0','1','2','3','4','5','6','7','8', '9', '10') THEN 1 ELSE 0 END) = 0 THEN NULL ELSE (CAST(SUM(CASE WHEN a.ERP IN ('8', '9', '10') THEN 1 ELSE 0 END) AS FLOAT) / CAST(SUM(CASE WHEN a.ERP in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10') THEN 1 ELSE 0 END) AS FLOAT))END AS ERP
-- ColListEnd
FROM
    (/*Eurgh!  Hideous legacy code that makes my eyes bleed just glancing at it*/) a 

Where  a.Area IN ('WE', 'mw','ne','so') 
and a.Location not in ('West Area Staff - CS', 'Northeast Area Staff - CS', 'Midwest Area Staff - CS', 'Others', 'West Area Finance - CS', 'Midwest Area Marketing, Sales, & Training', 'South Area Staff - CS', 'Midwest Area Finance - CS', 'Bellevue - CS')
and a.deptgroup in ('aol','bilingual','Bilingual Tech','care','global','lnp', 'onebill','other','retention','tech', 'new hire transition') 

group by 
a.area,
a.location,
a.monthname

--------------------------------------------------------------------------------REPEAT TABLE------------------------------------------------------------------------------------------------------
 IF OBJECT_ID('tempdb..#HRRep') 
IS NOT NULL DROP TABLE #HRRep 
CREATE TABLE #HRRep (AreaID VARCHAR(4), Location VARCHAR(50),MonthName VARCHAR(6), HourRepeatPercent FLOAT)
INSERT INTO #HRRep (AreaID, Location, MonthName, HourRepeatPercent) 
  Select
  -- ColList Start
  eh.AreaID, vl.VirtualLocationDescription, Month (acs.statdate) AS MonthName,

Cast(Sum(acs.Repeats2Hr)as float) /nullif(Sum(acs.Calls2Hr), 0) as 'HourRepeatPercent'
    -- COlListEnd
From 
    /* More hideous legacy code */

Полученная вами ошибка «Столбцы в INSERT и SELECT должны совпадать» исчезнет, ​​если вы просто убедитесь, что столбцы в SELECT соответствуют столбцам в таблице, на которую ссылается INSERT (мои комментарии -ColListStart и -ColListEnd определяют эту область). Таким образом, вы добавили бы свой дополнительный столбец в каждую CREATE TABLE, а затем добавили бы его (возможно, изначально, так же, как буквальное

'AnAreaDirector' AS AreaDirector

) к оператору SELECT, в нужном месте, конечно, по порядку. Вы также добавите GROUP BY AreaDirector в конце каждого SELECT (т. е. после всего остального).

Затем начинается настоящее веселье, которое заключается в копании материала внутри () (который я вырезал) и выяснении, можете ли вы получить столбец AD из таблиц, на которые они ссылаются, или вам нужно присоединиться к еще другой стол.

person sebt    schedule 15.11.2012
comment
Большое спасибо за то, что разобрали это до моего уровня понимания! Я собираюсь попробовать внести эти коррективы. Я отправлю обратно, если у меня возникнут проблемы. Я ценю помощь, себ. - person ciw916; 16.11.2012
comment
Я добился прогресса, Себт! Однако я столкнулся с неразберихой. Не могли бы вы сделать мне удовольствие взглянуть на редактирование моего исходного поста? Буду очень признателен, если у вас есть идеи. - person ciw916; 16.11.2012