0

我需要帮助编写矩阵样式报告的查询。

我的数据格式如下

id    body_part   incident_type1  incident_type2   incident_type3 
1     head        PPE             null             null 
2     ankle       Unsafe Act      Facility         null
3     hand        null            null             null
4     head        Facility        PPE              Unsafe Act

我希望行是身体部位,列是事件类型。如果 event_type1 为空,那么我想在“n/a”列中进行计数。但是,如果 event_type2 和/或 3 为空,我不希望它们计入“n/a”列。

            Facility    Unsafe Act    PPE     N/A
ankle        1            1            0       0
hand         0            0            0       1
head         1            1            2       0
4

2 回答 2

0

这是执行此操作的一种方法:

select body_part
  , Facility = sum(case when incident_type1 = 'Facility' or incident_type2 = 'Facility'  or incident_type3 = 'Facility' then 1 else 0 end)
  , [Unsafe Act] = sum(case when incident_type1 = 'Unsafe Act' or incident_type2 = 'Unsafe Act'  or incident_type3 = 'Unsafe Act' then 1 else 0 end)
  , PPE = sum(case when incident_type1 = 'PPE' or incident_type2 = 'PPE'  or incident_type3 = 'PPE' then 1 else 0 end)
  , [N/A] = sum(case when incident_type1 is null then 1 else 0 end)
from Incidents
group by body_part
order by body_part

SQL Fiddle 与演示

这假定已知事件类型,并且同一行不会多次具有相同的事件类型。

于 2013-06-03T09:09:24.657 回答
0

我可以通过创建一个将数据插入临时表的存储过程来完成这项工作。然后我可以使用带有“EXEC SP_Name”的报告向导作为查询。然后我选择 Body_part 作为我的行,Incident_type 作为我的列,Totals 作为我的数据。

CREATE TABLE #tmp
(
    Body_part VARCHAR(200) NOT NULL,
    Incident_type VARCHAR(250) NOT NULL,
)

INSERT INTO #tmp
SELECT ISNULL(Body_part, 'N/A'), ISNULL(Incident_type, 'N/A')
FROM [safety].vwIncomingPINS
WHERE submitted_on >= dateadd(year,-1,getdate()) AND submitted_on <=getdate()

INSERT INTO #tmp
SELECT ISNULL(Body_part, 'N/A'), Incident_type2
FROM [safety].vwIncomingPINS
WHERE submitted_on >= dateadd(year,-1,getdate()) AND submitted_on <=getdate() AND Incident_type2 IS NOT NULL

INSERT INTO #tmp
SELECT ISNULL(Body_part, 'N/A'), Incident_type3
FROM [safety].vwIncomingPINS
WHERE submitted_on >= dateadd(year,-1,getdate()) AND submitted_on <=getdate() AND Incident_type3 IS NOT NULL

SELECT Body_part, Incident_type, count(*) AS Totals from #tmp
GROUP BY Body_part, Incident_type
于 2013-06-03T19:44:40.387 回答