2013-12-19 94 views
0

此查詢有什麼問題?PostgreSQL子查詢不起作用

select extract(week from created_at) as week, 
     count(*) as received, 
     (select count(*) from bugs where extract(week from updated_at) = a.week) as done 
from bugs as a 
group by week 

的錯誤信息是:

列a.week不存在

UPDATE:

第一註釋的建議下,我嘗試這樣做:

select a.extract(week from created_at) as week, 
    count(*) as received, (select count(*) 
from bugs 
where extract(week from updated_at) = a.week) as done from bugs as a group by week 

但它似乎不工作:

ERROR: syntax error at or near "from" 
LINE 1: select a.extract(week from a.created_at) as week, count(*) a... 
+0

一樣,你需要使用'a.extract不能引用別名(本週created_at)'代替 –

+0

這使得感覺,但它似乎並不奏效。我可能誤解了...... – ndemoreau

+0

你不能在嵌套選擇中使用'a.week'。 –

回答

3

至於我可以告訴你不需要子選擇可言:

select extract(week from created_at) as week, 
     count(*) as received, 
     sum(case when extract(week from updated_at) = extract(week from created_at) then 1 end) as done 
from bugs 
group by week 

此計算每週所有的錯誤和將那些在同一周更新的內容計爲「完成」。

請注意,如果您的表格中沒有超過一年的時間,您的查詢將只報告正確的值。

如果你在表中的數據超過一年,你需要在比較這一年,以及:

select to_char(created_at, 'iyyy-iw') as week, 
     count(*) as received, 
     sum(case when to_char(created_at, 'iyyy-iw') = to_char(updated_at, 'iyyy-iw') then 1 end) as done 
from bugs 
group by week 

請注意,我用IYYYIW以配合ISO定義年和週年結束/開始。


也許在爲什麼你的原始查詢沒有工作將是有益的一點解釋:

「外」查詢使用兩個別名

  • bugs表別名命名a
  • 列表別名爲extract(week from created_at)的列名爲week

地方,別名week可以使用是group by子句。

對於子選擇(select count(*) from bugs where extract(week from updated_at) = a.week)),別名a是可見的,但不是別名week(這是如何定義SQL標準的)。

爲了讓您的子查詢工作(在列可視性方面),你就需要引用「外」欄目充分表達:

(select count(*) from bugs b where extract(week from b.updated_at) = extract(week from a.created_at)) 

注意,我爲了使引入另一個表的別名b它清楚哪個列源自哪個別名。

但即使如此,你也會遇到分組問題,因爲你不能引用那樣的未分組列。

1

可以工作以及

with origin as (
    select extract(week from created_at) as week, count(*) as received 
    from bugs 
    group by week 
) 
select week, received, 
    (select count(*) from bugs where week = extract(week from updated_at)) 
from origin 

它應該有不錯的表現

+0

謝謝!我不知道這個「帶有起源」的命令 – ndemoreau

+0

它不是「帶有起源」,而是「帶有」起名「」。我使用origin作爲以下查詢的名稱。用你喜歡的任何其他名稱取代原產地 – devanand