2017-09-25 14 views
1

我有與各種WIPReason相關聯的驗證錯誤,我想根據不同的WIPReason計數,我使用Union All,它的工作原理但查詢很大,小於10請看以下在表中沒有union的所有數據的多個值的計數在sql中

SELECT  
    COUNT(tlv.TransactionLineId) AS TotalErrors, 
    COUNT(tl.Id) AS TotalLines, 
    COUNT(tlv.Reason) AS NoWorkRecords, 
    0 AS ValidationErrors 
FROM 
    dbo.TimesheetCellTransactionLine tctl 
INNER JOIN 
    dbo.TransactionLine tl ON tctl.TransactionLineId = tl.Id 
INNER JOIN 
    dbo.TransactionLineValidation tlv ON tl.Id = tlv.TransactionLineId 
INNER JOIN 
    dbo.WIPReason w ON tlv.Reason = w.Id 
WHERE 
    tl.CurrentStatus = 1 
    AND w.Id = 4 -- NoWorkRecords 
GROUP BY 
    tlv.TransactionLineId, tl.Id 

UNION ALL 

SELECT 
    COUNT(tlv.TransactionLineId) AS TotalErrors, 
    COUNT(tl.Id) AS TotalLines, 
    0 AS NoWorkRecords, 
    COUNT(tlv.Reason) AS ValidationErrors 
FROM 
    dbo.TimesheetCellTransactionLine tctl 
INNER JOIN 
    dbo.TransactionLine tl ON tctl.TransactionLineId = tl.Id 
INNER JOIN 
    dbo.TransactionLineValidation tlv ON tl.Id = tlv.TransactionLineId 
INNER JOIN 
    dbo.WIPReason w ON tlv.Reason = w.Id 
WHERE 
    tl.CurrentStatus = 1 
    AND w.Id = 1 -- validationErrors 
GROUP BY 
    tlv.TransactionLineId, tl.Id 

查詢是否有這樣做的w.Id = 1〜10

和w.Id = 1的任何其他優雅的方式 - validationErrors

更新: 我希望結果作爲列10計數列,因爲我在另一個大選中使用此列。

+0

試分區 –

+0

添加'w.Id'到'select'列表,'和w.Id> = 1和w.Id <= 10如果你需要限制範圍,可以用'where子句'來代替'AND w.Id = 4','w.Id'則可以用在'group by'的適當位置。您可能還想添加一個'order by'子句。 – HABO

回答

1

您可以使用case語句中count這樣的:

SELECT  
    COUNT(tlv.TransactionLineId) AS TotalErrors, 
    COUNT(tl.Id) AS TotalLines, 
    COUNT(case when w.Id = 4 then tlv.Reason else null end) AS NoWorkRecords, 
    COUNT(case when w.Id = 1 then tlv.Reason else null end) AS ValidationErrors, 
    ... Repeat for remaining w.Id's ... 
FROM 
    dbo.TimesheetCellTransactionLine tctl 
INNER JOIN 
    dbo.TransactionLine tl ON tctl.TransactionLineId = tl.Id 
INNER JOIN 
    dbo.TransactionLineValidation tlv ON tl.Id = tlv.TransactionLineId 
INNER JOIN 
    dbo.WIPReason w ON tlv.Reason = w.Id 
WHERE 
    tl.CurrentStatus = 1 
GROUP BY 
    tlv.TransactionLineId, tl.Id 

注意 由於您使用的是inner join on tl.Id = tlv.TransactionLineId

  1. TotalErrors/TotalLines總是將是同樣的
  2. 分組通過tl.Idtlv.TransactionLineId不必通過w.id
1
SELECT COUNT(tlv.TransactionLineId) OVER (partition by (w.Id) order by w.Id) AS TotalErrors, 
     COUNT(tl.Id) OVER (partition by (w.Id) order by w.Id) AS TotalLines, 
     0 AS NoWorkRecords, 
     COUNT(tlv.Reason) OVER (partition by (w.Id) order by w.Id) AS ValidationErrors 
FROM dbo.TimesheetCellTransactionLine tctl 
    INNER JOIN dbo.TransactionLine tl ON tctl.TransactionLineId = tl.Id 
    INNER JOIN dbo.TransactionLineValidation tlv ON tl.Id = tlv.TransactionLineId 
    INNER JOIN dbo.WIPReason w ON tlv.Reason = w.Id 
WHERE tl.CurrentStatus = 1 
     AND w.Id between 1 and 10 -- validationErrors 
GROUP BY tlv.TransactionLineId, 
     tl.Id,tlv.Reason 
+0

這會給我10行 - 我想要的是10列作爲計數,因爲我在另一個大選擇使用此查詢。 – jjj

+1

你應該將行轉到列,這應該很容易 –

相關問題