2016-04-15 30 views
1

我有一個SQL語句,它提供了作業中的債權人列表。 在圖中的例子中,兩個債權人都屬於同一個工作。 因此,在顯示TOTALS的最後一行中,作業數量爲1,這是正確的,因爲它是相同的作業。此外,說NotPOD的列也是正確的,只說1。 但是對於所有其他列,它將添加總計。就像說FL的列(它是一種類型的)。這項工作只有1個FL件類型。但由於這項工作有兩個債權人,即使只有一個債權人存在,總數也會顯示兩個。WITH ROLLUP不計算某些列上的總計

enter image description here

我不知道總計如何工作和NotPOD正確的。

這裏是SQL語句:

SET group_concat_max_len=10000000; 
set @sql = null; 
select 
    group_concat(distinct 
    concat(
     'sum((select sum(jp1.AdvisedQty) 
       from job_pieces jp1 
       left join piecestype pt1 on jp1.TypeID = pt1.ID 
       where jp1.jobid=jn.id and pt1.code=''', pt.Code , ''' 
      )) AS `', pt.Code, '`' 
    ) 
) into @sql 
FROM creditor c 
LEFT JOIN invoicedetail i on c.ID = i.creditorId 
LEFT JOIN job_new jn ON i.JobID = jn.ID 
LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
WHERE c.Company_ID = ?compid; 

set @sql = concat('select 
     ifnull(c.Name,''TOTAL'') as Name, 
     COUNT(distinct jn.ID) as Jobs, 
     sum(case when (select count(jbs.status) from jobstat jbs 
       where jbs.jobid=jn.id and jbs.Status=''DEL'')>0 
         then 1 else 0 end) as Delivered, 
     sum(case when (select count(jbs.status) from jobstat jbs 
       where jbs.jobid=jn.id and jbs.Status=''POD'')>0 
         then 1 else 0 end) as POD, 
     SUM((select COUNT(ID) from job_debriefs 
       WHERE JobID = jn.ID)) as Debriefs, 
     sum(jn.OutTurn) as Outturn, 
     SUM(jn.ActualWeight) as GrossWt, 
     ', @sql, ' 
    FROM creditor c 
    LEFT JOIN invoicedetail i on c.ID = i.creditorId 
    LEFT JOIN job_new jn ON i.JobID = jn.ID 
    LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
    LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
    WHERE c.Company_ID = ', ?compid, GROUP BY c.Name WITH ROLLUP 
+0

你可以試着格式化查詢嗎? –

+0

@GordonLinoff對不起,你的意思是? – user123456789

+0

'SELECT @ sql' at then end - 在所有正在進行的遊戲之後查看SQL可能會很有幫助。 –

回答

0

我懷疑你的問題是,因爲你的小組通過條件。

你執行GROUP BY c.Name WITH ROLLUP,據我瞭解 - 你的c.Name是債權人的名字。

嘗試按作業ID或記錄的其他唯一標識符進行分組。

+0

更改GROUP BY將返回錯誤的數據。如果我使用債權人ID或工作ID,那麼結果是錯誤的。 – user123456789

+0

您在查詢中有很多條件,在看不到數據的情況下很難理解。彙總工作正常,因爲它應該。你只需要執行一個不同的計算,而不是'rollup'。如果沒有少量的樣本數據,幫不了你的忙。 – Tata

+0

但是'rollup'工作如何糾正它說,總工作是1,但它將所有其他列加在一起?是否有不同的方式來計算沒有「彙總」的底行的總數? – user123456789

2

with rollup -flag在您使用count(distinct)sum時會做不同的事情。

對於COUNT(distinct jn.ID)它會給你所有顯示的數據不同的Jobids數量。這可能是你想要的。

對於像sum(case...) as POD這樣的總和列,它只會給你所有顯示值的總和 - 如果作業的狀態爲「POD」,則POD將爲「2」。至於NotPOD列:我假設你只是在你的客戶端計算它(也許作爲Jobs-POD),並且由於POD爲0(可能已經是2),它看起來很不錯。我假設你也在你的客戶中計算「單位」(作爲4種類型的總和)。如果沒有,你的代碼不適合你的照片。

那麼如何解決它呢?

那麼,基本上你不能使用with rollup,主要是因爲你不想要顯示值的總和,這就是with rollup的用途。

最簡單的解決方案是手動計算總行數並將它們與union(例如,像這樣:

select c.Name as Name, 
    COUNT(distinct jn.ID) as Jobs, 
    ... 
    sum(jn.OutTurn) as Outturn, 
    SUM(jn.ActualWeight) as GrossWt, 
    ... 
    FROM creditor c 
    LEFT JOIN invoicedetail i on c.ID = i.creditorId 
    LEFT JOIN job_new jn ON i.JobID = jn.ID 
    -- !!! DO NOT USE LEFT JOIN job_pieces jp ON jp.JobID = jn.ID !!! 
    -- !!! DO NOT USE LEFT JOIN piecestype pt on jp.TypeID = pt.ID !!! 
    WHERE c.Company_ID = ', ?compid, GROUP BY c.Name, ' 
UNION 
    ''Total'', 
    COUNT(distinct jn.ID) as Jobs, 
    ... 
    sum(jn.OutTurn) as Outturn, 
    SUM(jn.ActualWeight) as GrossWt, 
    ... 
    -- you have to figure out what number you need here for the pieces 
    -- you probably want to seperate that part too (as you did with @sql) 
    -- (select sum(jp1.AdvisedQty) from job_pieces jp1 ...) as FL 
    ... 
    from job_new jn 
    WHERE exists(select 1 
       FROM creditor c 
       JOIN invoicedetail i on c.ID = i.creditorId 
       where i.JobID = jn.ID and c.Company_ID = ', ?compid, ' 
       ) 

沒有group by在第二部分! 你必須找出你想要的每件和數什麼樣的價值觀,你可能要與語句同樣準備到您select group_concat(distinct ...

併發出警告:如果我正確理解你的數據模型,你絕對要除去

LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
LEFT JOIN piecestype pt on jp.TypeID = pt.ID 

語句,因爲當你有一個工作不止一個jobpiece或piecetype他們會毀了你的價值觀(你可以嘗試添加第二個值的工作,看到)。如果你可能在一個invoicedetail上有兩次相同的工作,你也必須修復那部分。

並且要注意,在工會部分,你不能加入顧客(你會多次計數一切)。