2013-04-08 9 views
0

У меня есть довольно большая таблица, которая должна быть отфильтрована по-разному для нескольких разных рабочих отделов. Я создал следующий запрос, который возвращает одинаковое количество столбцов, чтобы они могли быть UNION'd. Я хочу, чтобы не возвращались повторяющиеся строки, поэтому я использовал UNION, однако я продолжаю получать ошибку «Msg 8120, Level 16, State 1, Line 53 Столбец ACT_DW.dbo.INV-ACT.DNUM недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. "
Кто-нибудь видит проблему здесь? То, что я хочу получить, - это просто одна большая таблица всех записей, сгруппированных по полю Deskname на рабочую группу, если это возможно.Группировка нескольких запросов в одной таблице, TQSL

declare @InventoryAsOfEOD date, 
     @Start date, 
     @End date 


SET @Start = CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0) AS DATE) 
SET @End = CAST(DATEADD(DAY, -(DAY(DATEADD(MONTH, 1, GETDATE()))), DATEADD(MONTH, 1, GETDATE())) as DATE) 

IF 
    DATENAME(DW, GETDATE()) = 'Monday' 
BEGIN 
    Set @InventoryAsOfEOD = CAST(DATEADD(D, -3, GETDATE())AS DATE) 
END 
ELSE 
    Set @InventoryAsOfEOD = CAST(DATEADD(D, -1, GETDATE()) AS DATE) 

print @inventoryasofeod 
print @start 
print @end 



SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    DueDate, 
    PnI, 
    PIBALATSETUP, 
    Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    Ttl_Starts 

FROM 

(SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    PROGSTARTDT as DueDate, 
    sum([Prinbal]+[INTBAL]) as PnI, 
    PIBALATSETUP, 
    BALANCE as Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    COUNT(SSN) as Ttl_Starts 

FROM 
    [ACT_DW].[dbo].[INV-ACT] with(INDEX([IX_INV-ACT_InventoryAsOfEOD]),nolock) 
WHERE 
    InventoryAsOfEOD = @InventoryAsOfEOD AND 
    BC ='GSL' AND 
    PROGTYPE not in('PMT PLAN', 'Fallout', 'PIF', 'SIF') AND 
    PROGTYPE is not null and 
    PYMTDT1 BETWEEN @Start AND @End 


UNION 
--Get Oregon Starts 

SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    PROGSTARTDT as DueDate, 
    sum([Prinbal]+[INTBAL]) as PnI, 
    PIBALATSETUP, 
    BALANCE as Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    COUNT(SSN) as Ttl_Starts 

FROM 
    [ACT_DW].[dbo].[INV-ACT] with(INDEX([IX_INV-ACT_InventoryAsOfEOD]),nolock) 
WHERE 
    InventoryAsOfEOD = @InventoryAsOfEOD and 
    CLIENT like 'ORDOR%' and  
    PROGTYPE not in ('Null', 'Fallout') AND 
    PYMTDT1 BETWEEN @Start AND @End 


UNION 
--Get Perkins Starts 

SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    PROGSTARTDT as DueDate, 
    sum([Prinbal]+[INTBAL]) as PnI, 
    PIBALATSETUP, 
    BALANCE as Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    COUNT(SSN) as Ttl_Starts 
FROM 
    [ACT_DW].[dbo].[INV-ACT] with(INDEX([IX_INV-ACT_InventoryAsOfEOD]),nolock) 
WHERE 
    InventoryAsOfEOD = @InventoryAsOfEOD and 
    BC in ('PE1', 'PE2', 'PE3', 'NU1', 'NU2', 'NDS') and 
    PROGTYPE not in ('Null', 'Fallout') AND 
    PYMTDT1 BETWEEN @Start AND @End 

UNION 

--Get starts for Tuition 

SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    PROGSTARTDT as DueDate, 
    sum([Prinbal]+[INTBAL]) as PnI, 
    PIBALATSETUP, 
    BALANCE as Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    COUNT(SSN) as Ttl_Starts 
FROM 
    [ACT_DW].[dbo].[INV-ACT] with(INDEX([IX_INV-ACT_InventoryAsOfEOD]),nolock) 
WHERE 
    InventoryAsOfEOD = @InventoryAsOfEOD and 
    BC in ('AR1', 'AR2', 'IN1', 'IN2', 'IN3', 'TU1', 'TU2', 'TU3') and 
    PROGTYPE not in ('Null', 'Fallout') AND 
    PYMTDT1 BETWEEN @Start AND @End 

UNION 

--Get Starts for Chase 

SELECT 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    [DESK], 
    Deskname, 
    PYMTAMT1, 
    PROGSTARTDT as DueDate, 
    sum([Prinbal]+[INTBAL]) as PnI, 
    PIBALATSETUP, 
    BALANCE as Ttl_Balance, 
    pmgroup, 
    PROGTYPE, 
    office, 
    client, 
    batch, 
    placetype, 
    pymtdt1, 
    COUNT(SSN) as Ttl_Starts 
FROM 
    [ACT_DW].[dbo].[INV-ACT] with(INDEX([IX_INV-ACT_InventoryAsOfEOD]),nolock) 
WHERE 
    InventoryAsOfEOD = @InventoryAsOfEOD and 
    CLIENT like 'AG%' and 
    PROGTYPE not in ('Null', 'Fallout') AND 
    PYMTDT1 BETWEEN @Start AND @End) 
    as StartsTable 

GROUP BY 
    DNUM, 
    SSN, 
    DTRFIRSTNAME, 
    DTRLASTNAME, 
    ASSIGNDATE, 
    PYMTAMT1, 
    DueDate, 
    PIBALATSETUP, 
    Ttl_Balance, 
    PROGTYPE, 
    DESK, 
    deskname, 
    PMGROUP, 
    OFFICE, 
    CLIENT, 
    BATCH, 
    PLACETYPE, 
    PYMTDT1 
ORDER BY 
    PMGROUP, 
    DESK 

ответ

0

Для каждого подзапроса, который включает в себя агрегаты, вам необходимо указать свой пункт GROUP BY. Вместо этого вы можете объединить строки и , тогда aggregate, но это будет другой запрос.

+0

Хм- это сработало (группа в каждом подзапросе)! Спасибо за помощь, я новичок в SQL, иногда это всего лишь самые маленькие вещи ... – CTolbert

Смежные вопросы