2017-09-25 13 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

你应该将行转到列,这应该很容易 –

相关问题