2017-02-16 56 views
1

Я немного недоумеваю, почему мой результат этого утверждения показывает null в Project_ID. Я взглянул на нижнюю запись и попробовал inner join, но результат был тщетным, так же как и с left join. У меня есть только два разных Project_ID. По какой-то нечетной причине Name снова заявляется с Count, добавленным из предыдущих списков. Почему он это делает и как я могу это исправить? Пожалуйста, предоставьте свой совет.Почему синтаксис SQL не указан?

Why does my SQL query return rows with NULL? It should never return rows with NULL

select dp."Name",count(dp."Name") Count,max(to_char(ft."Hours",'9,999')) "Maximum Hours Worked", 
max(ft."Salary"::money) "Maximum Salary", 
ft."Project_ID" 
from facttable ft 
left join alldatainput dp on dp."alldatainputpk" = ft."alldatainputfk" 
group by rollup(dp."Name",ft."Project_ID") 

Результат:

 Name    Count Maximum Hours Worked Maximum Salary Project_ID 
Hulk Hogan    157   3,500    $432,995.00  LFC 
Hulk Hogan    43   3,499    $550,000.00  PCR 
Hulk Hogan    200   3,500    $550,000.00 (null) 
Andre the Giant   42   5,300    $870,000.00  PCR 
Andre the Giant   42   5,300    $870,000.00 (null) 
Bret Hart    5   3,675    $512,000.00  LFC 
Bret Hart    10   4,193    $716,510.00  PCR 
Bret Hart    15   4,193    $716,510.00 (null) 
Winnie the Pooh   561   5,600    $929,654.00  PCR 
Winnie the Pooh   561   5,600    $929,654.00 (null) 
         1000   5,600    $929,654.00 (null) 
+4

Это от 'rollup' - Это ваши применения агрегатов по каждой группировке' name' и 'Project_Id' как резюме. Таким образом, вы получаете полную учетную запись 'count' и' max' для группы из отработанных часов и зарплаты. Окончательная запись - это сводка всего набора. – Siyual

+0

Если я удалю 'rollup', это не даст мне общее для каждого столбца. Каков наиболее жизнеспособный способ добавить общее количество ко всем столбцам для этого утверждения? –

+0

К сожалению, я не знаю достаточно о синтаксисе postgres, чтобы ответить, как отфильтровать подгруппы. – Siyual

ответ

1

Grouping Sets

select 
    dp.Name,count(dp."Name") Count, 
    max(to_char(ft."Hours",'9,999')) "Maximum Hours Worked", 
    max(ft."Salary"::money) "Maximum Salary", 
    ft."Project_ID" 
from 
    facttable ft 
    left join 
    alldatainput dp on dp."alldatainputpk" = ft."alldatainputfk" 
group by grouping sets ((dp."Name",ft."Project_ID"),())