2016-09-28 7 views
0

написал запрос для извлечения данных и просуммировать область значенийSUM значений игнорирования GROUP BY - SQL SERVER 2008

SELECT 
rtrim(fmb0.reg_code) as Region, 
RTRIM(FMB0.COUNTRY) AS COUNTRY, 
RTRIM(FMB0.BLDGCODE) AS BLDGCODE, 
(CASE WHEN FMB0.BLDGSTATUS = '' THEN 'RECORD' 
ELSE FMB0.BLDGSTATUS END) AS SOURCE, 
(CASE 
WHEN FMA0.SPACETYPE = 'U-TLS-AS' THEN round(SUM(fma0.AREA),3) 
ELSE round(SUM(fma0.USABLE),3) END) as [CHARGEABLE AREA], 
(CASE 
WHEN len(rtrim(fma0.group_))<1 THEN '**Unassigned**' 
ELSE RTRIM(FMA0.GROUP_) END) AS [COST CODE], 
(CASE 
WHEN len(rtrim(fma0.group_))<1 THEN '**Unassigned Space**' 
WHEN len(rtrim(fma0.group_))>1 AND rtrim(FMG0.GROUPDESC) IS NULL   THEN '**Inactive Cost Code**' 
ELSE RTRIM(FMG0.GROUPDESC) END) AS [COST CENTRE] 

FROM FMA0 

LEFT JOIN FMB0 ON FMA0.BLDGCODE = FMB0.BLDGCODE 
LEFT JOIN FMG0 ON FMA0.GROUP_ = FMG0.GROUP_ 

GROUP BY FMB0.BLDGCODE, FMA0.FLOORCODE, FMA0.GROUP_, FMG0.GROUPDESC, FMG0.GROUPDESC3, FMB0.BLDGSTATUS, FMB0.COUNTRY, FMB0.REG_CODE,FMA0.SPACETYPE 

потому что я должен использовать SPACETYPE, чтобы определить, какое поле взять AREA от меня нужен включить SPACETYPE в предложение GROUP BY. Это означает, что я вижу результаты, разделенные SPACETYPE, хотя я напрямую не запрашиваю его в инструкции SELECT.

Region COUNTRY BLDGCODE SOURCE FLOORCODE CHARGEABLE AREA COST CODE  COST CENTRE 
ASP  Hong Kong BLDG01 CAD   28  39.016   **Unassigned** **Unassigned Space** 
ASP  Hong Kong BLDG01 CAD   28  1217.146  **Unassigned** **Unassigned Space** 
ASP  Hong Kong BLDG01 CAD   28  1506.181  **Unassigned** **Unassigned Space** 
ASP  Hong Kong BLDG01 CAD   28  458.765   **Unassigned** **Unassigned Space** 
ASP  Hong Kong BLDG01 CAD   28  1000.711  **Unassigned** **Unassigned Space** 

Как получить одну строку для всей площади всех SPACETYPES в частности BLDGCODE раскол по КОДЕКСА COST

+0

Выполняет ли этот запрос даже выполнение? – jarlh

ответ

2

попробуйте использовать Common Table Expression, чтобы получить подробную информацию, то агрегатные:

WITH CTE 
AS 
(
    SELECT rtrim(fmb0.reg_code) as Region, 
      RTRIM(FMB0.COUNTRY) AS COUNTRY, 
      RTRIM(FMB0.BLDGCODE) AS BLDGCODE, 
      (CASE WHEN FMB0.BLDGSTATUS = '' THEN 'RECORD' 
       ELSE FMB0.BLDGSTATUS END) AS SOURCE, 
      (CASE WHEN FMA0.SPACETYPE = 'U-TLS-AS' THEN round(fma0.AREA,3) 
       ELSE round(fma0.USABLE,3) END) as [CHARGEABLE AREA], 
      (CASE WHEN len(rtrim(fma0.group_))<1 THEN '**Unassigned**' 
       ELSE RTRIM(FMA0.GROUP_) END) AS [COST CODE], 
      (CASE WHEN len(rtrim(fma0.group_))<1 THEN '**Unassigned Space**' 
       WHEN len(rtrim(fma0.group_))>1 
        AND rtrim(FMG0.GROUPDESC) IS NULL THEN '**Inactive Cost Code**' 
       ELSE RTRIM(FMG0.GROUPDESC) END) AS [COST CENTRE] 
    FROM FMA0 
    LEFT JOIN FMB0 ON FMA0.BLDGCODE = FMB0.BLDGCODE 
    LEFT JOIN FMG0 ON FMA0.GROUP_ = FMG0.GROUP_ 
) 
SELECT Region, Country, BLDGCODE, Source, 
     (SUM([CHARGEABLE AREA]) AS [Chargeable Area], [COST CODE],[COST CENTRE] 
FROM CTE 
GROUP BY BLDGCODE, [Cost Code], [Cost Centre], Source, COUNTRY, Region 
+0

Спасибо Стив. Но получите ошибку – FredTheDog

+0

Msg 8120, уровень 16, состояние 1, строка 6 Столбец «FMB0.REG_CODE» недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. – FredTheDog

+0

Еще раз спасибо Steve – FredTheDog