2016-08-22 2 views
0

Я получаю следующую ошибку при запуске этого кода. пожалуйста, помогите мне.Ошибка с группой по заявлению?

SELECT store, COUNT(DISTINCT saledate), CountNov, CountDec, SumNov, SumDec, (SumNov/CountNov) AS NovAvgRvn, (SumDec/CountDec) AS DecAvgRvn FROM 
(
SELECT store, saledate, 
CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END) IS NULL THEN 0 
ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END) 
END AS SumNov, 
CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) IS NULL THEN 0 
ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) 
END AS SumDec, 
CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) IS NULL THEN 0 
ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) 
END AS CountNov, 
CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) IS NULL THEN 0 
ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) 
END AS CountDec 
FROM trnsact 
WHERE stype = 'p' 
GROUP BY store, saledate 
) AS T1 
WHERE CountDec > 0 AND CountNov > 0 
GROUP BY store 
ORDER BY store; 

Ошибка: Код ошибки - 3504 Сообщение об ошибке - [Teradata Database] [TeraJDBC 15.10.00.05] [Ошибка 3504] [SQLState HY000] Выбранные без агрегированные значения должны быть частью соответствующей группы.

ответ

0

Все, что находится в вашем отборном заявлении, которое не представляет собой совокупность как SUM, AVG и т.д. должно быть включено в группе по статье, если у вас есть группа по п

Попробуйте эту надежду, что помогает:

SELECT store, COUNT(DISTINCT saledate), CountNov, CountDec, SumNov, SumDec, (SumNov/CountNov) AS NovAvgRvn, (SumDec/CountDec) AS DecAvgRvn FROM 
(
    SELECT store, saledate, 
       CASE WHEN 
         SUM(CASE EXTRACT(MONTH FROM saledate) 
           WHEN '11' THEN amt END) IS NULL THEN 0 
          ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END) 
         END AS SumNov, 
       CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) IS NULL THEN 0 
          ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) 
         END AS SumDec, 
       CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) IS NULL THEN 0 
          ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) 
         END AS CountNov, 
       CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) IS NULL THEN 0 
          ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) 
         END AS CountDec 
    FROM trnsact 
    WHERE stype = 'p' 
    GROUP BY store, saledate, SumNov, SumDec, CountNov, CountDec 
) AS T1 
    WHERE CountDec > 0 AND CountNov > 0 
GROUP BY store, saledate, CountNov, CountDec, SumNov, SumDec, NovAvgRvn, DecAvgRvn 
ORDER BY store; 
+0

Anjani, Спасибо за ур ответ но я не могу использовать CountNov, CountDec, SumNov, SumDec, поскольку они являются совокупными функциями, которые используют сумму, coount. Так что старайтесь с NovAvgRvn, DecAvgRvn и см. – Vish

+0

Но все-таки я получаю ошибку, не уверен, какое не суммарное значение я упускаю ??? – Vish

1

Почему вы используете для этого вложенный запрос?

SELECT store, COUNT(DISTINCT saledate), 
     SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) as SumNov, 
     SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) as SumDec, 
     COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN saledate END) as CountNov, 
     COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN saledate END) as CountDec 
FROM trnsact 
WHERE stype = 'p' 
GROUP BY store; 

Примечания:

  • COUNT() никогда не возвращается NULL поэтому нет никакой необходимости в CASE вообще.
  • С ELSE пункта, то SUM() не возвращает NULL либо (там бы не быть ни одной строки, соответствующие для SUM() вернуть NULL, и без каких-либо совпадающих строк в группе, группа не будет существовать).
  • EXTRACT() возвращает число, поэтому сравните с числом.
+0

ok Спасибо, Гордон. Так что я использую это сейчас !!! – Vish

0

GROUP BY в Derived таблице не делает агрегацию на уровне месяца, таким образом COUNT(DISTINCT saledate) будет 1. Вы не должны использовать строки для числовых данных (результат EXTRACT). Вам не нужен CASE(SUM) потому COUNT никогда не возвращает NULL (вы можете использовать COALESCE вместо):

Я предполагаю, что вы хотите запрос, как это вместо:

SELECT store, 
    -- if you only need the dates from Nov & Dec you can simply do 
    -- CountNov + CountDec instead 
    COUNT(DISTINCT saledate), 

    SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) AS SumNov, 
    SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN amt ELSE 0 END) AS SumDec, 
    COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN saledate END) AS CountNov, 
    COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN saledate END) AS CountDec, 
    (SumNov/CountNov) AS NovAvgRvn, 
    (SumDec/CountDec) AS DecAvgRvn 
FROM trnsact 
WHERE stype = 'p' 
    -- don't you need a condition to filter for a specific year/month? 
    AND EXTRACT(MONTH FROM saledate) IN (11,12) 
GROUP BY store 
ORDER BY store; 
+0

Thnx @dnoeth, но фильтрация за определенный месяц, год происходит в самом заявлении CASE? – Vish

+0

@Vish: вы будете запускать агрегацию по всем строкам в таблице, если вы не добавляете 'WHERE'-conditon, например. если у вас есть один год данных, вы обрабатываете 12 вместо двух месяцев. – dnoeth

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