2010-04-17 66 views
0

我有一個自定義的SQL調用將返回不同的結果比我得到的,當我在數據庫中直接運行相同的查詢模板,1排VS 2當查詢返回2時,Django自定義SQL返回單行結果?

查詢 - 從Django的調試工具欄複製:

SELECT ((Sum(new_recruit_interviews)/Sum(opportunities_offered)) * 100) as avg_recruit, ((Sum(inspections)/Sum(presentations)) * 100) as avg_inspect, ((Sum(contracts_signed)/Sum(roof_approvals)) * 100) as avg_contracts, ((Sum(adjusters)/Sum(contracts_signed)) * 100) as avg_adjusters, ((Sum(roof_approvals)/Sum(adjusters)) *100) as roof_approval_avg, ((Sum(roof_turned_in)/Sum(adjusters)) * 100) as roof_jobs_avg, Sum(roof_turned_in) as roof_jobs_total, 
((Sum(siding_approvals)/Sum(adjusters)) *100) as siding_approval_avg, ((Sum(siding_turned_in)/Sum(adjusters)) * 100) as siding_jobs_avg, Sum(siding_turned_in) as siding_jobs_total, ((Sum(gutter_approvals)/Sum(adjusters)) *100) as gutter_approval_avg, ((Sum(gutter_turned_in)/Sum(adjusters)) * 100) as gutter_jobs_avg, Sum(gutter_turned_in) as gutter_jobs_total, 
((Sum(window_approvals)/Sum(adjusters)) *100) as window_approval_avg, ((Sum(window_turned_in)/Sum(adjusters)) * 100) as window_jobs_avg, Sum(window_turned_in) as window_jobs_total, 
(Sum(roof_turned_in) + Sum(siding_turned_in) + Sum(gutter_turned_in) + Sum(window_turned_in)) as total_jobs, 
(((Sum(collections_jobs_new) + Sum(collections_jobs_previous))/(Sum(roof_turned_in) + Sum(siding_turned_in) + Sum(gutter_turned_in) + Sum(window_turned_in))) * 100) as total_collections, 
sales_report_salesmen.location_id as detail_id, business_unit_location.title as title 
FROM sales_report_salesmen 
Inner Join auth_user ON sales_report_salesmen.user_id = auth_user.id 
Inner Join business_unit_location ON sales_report_salesmen.location_id = business_unit_location.id 
GROUP BY location_id 
從直接查詢

結果運行上述查詢:

INSERT INTO `` (`avg_recruit`, `avg_inspect`, `avg_contracts`, `avg_adjusters`, `roof_approval_avg`, `roof_jobs_avg`, `roof_jobs_total`, `siding_approval_avg`, `siding_jobs_avg`, `siding_jobs_total`, `gutter_approval_avg`, `gutter_jobs_avg`, `gutter_jobs_total`, `window_approval_avg`, `window_jobs_avg`, `window_jobs_total`, `total_jobs`, `total_collections`, `detail_id`, `title`) 
    VALUES (95.3968, 92.8178, 106.9622, 90.2928, 103.5420, 103.5670, 4152, 100.2494, 106.8845, 4285, 120.1297, 86.2559, 3458, 92.9658, 106.1611, 4256, 16151, 4.281469, 12, 'St Paul, MN'); 

    VALUES (90.2982, 73.3723, 97.8474, 104.5433, 97.7585, 86.1848, 1884, 109.9268, 109.3321, 2390, 81.0156, 96.4318, 2108, 91.7200, 123.8792, 2708, 9090, 4.531573, 13, 'Denver, CO'); 

結果從模板:

{'roof_jobs_total': Decimal('4152'), 'gutter_jobs_total': Decimal('3458'), 'avg_adjusters': Decimal('90.2928'), 'title': u'St Paul, MN', 'window_approval_avg': Decimal('92.9658'), 'total_collections': Decimal('4.281469'), 'gutter_approval_avg': Decimal('120.1297'), 'avg_recruit': Decimal('95.3968'), 'siding_approval_avg': Decimal('100.2494'), 'window_jobs_total': Decimal('4256'), 'detail_id': 12L, 'siding_jobs_avg': Decimal('106.8845'), 'avg_inspect': Decimal('92.8178'), 'roof_approval_avg': Decimal('103.5420'), 'roof_jobs_avg': Decimal('103.5670'), 'total_jobs': Decimal('16151'), 'window_jobs_avg': Decimal('106.1611'), 'avg_contracts': Decimal('106.9622'), 'gutter_jobs_avg': Decimal('86.2559'), 'siding_jobs_total': Decimal('4285')} 

試圖調整它的一些方法,並通過各種for循環運行的結果,繼續得到同樣的結果在我的結果是通過Django模板單行和預期結果(通過控制檯)有2行

的行回來是通過控制檯查詢返回的第一行相同,所以我認爲它正確運行只是通過結果通過...

爲好措施這是代碼我用於生成查詢 (是的,它有點難看,一直在玩它)

def sql_grouped(table, fields, group_by=False, where=False): 
from django.db import connection 
query = 'SELECT %s FROM %s' % (fields, table) 
if where: 
    query = query + ' WHERE %s' % (where) 
if group_by: 
    query = query + ' GROUP BY %s' % (group_by) 

cursor = connection.cursor() 
cursor.execute(query) 

desc = cursor.description 
data = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] 
return data[0] 

任何反饋非常讚賞 - 被擺弄這一點,因爲我意識到我可以在SQL中直接生成我的平均數,而不是後期處理

+1

評論明顯地顯而易見:你確定你在兩次執行中連接到同一個數據庫?您不是錯誤地針對某個測試數據庫運行Django,而不是手動運行查詢的那個數據庫,對嗎? – cethegeek 2010-04-17 04:01:50

+0

是的,這是針對同一個數據庫,我在多個步驟中運行此操作,使用SUM(字段)&group by通過自定義SQL提取所有數據 - 然後通過模板標籤逐行創建平均值 - 很好(IE all數據正確),直到我開始分揀 – Alvin 2010-04-19 02:27:37

+0

進一步的細節:如果我從SELECT字段中取出數學並保留Sum和GROUP BY,那麼它會正確地返回多行 - 因爲它是數據都是正確的,但只有第一行返回 – Alvin 2010-04-19 02:58:28

回答

0

解決跳過了幾步 - 見上