[英]Get count for multiple fields using group by in SQL
我有以下表結構,也有提及我的預期輸出,請幫助我進行查詢,因為我對SQL查詢了解不多
查詢:
SELECT fname,
lname,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esilocation) AS ESILocation,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esidispensary) AS ESIDispensary,
dateofjoining,
terminationdate
FROM dbo.employeedetail
輸出:
FName LName ESILocation ESIDispensary DateOfJoining TerminationDate
Pratik Sawant pune mumbai 2014-06-08 2014-08-01
Nilesh Gajare pune pune 2014-09-12 2014-11-19
Praveen SONi mumbai mumbai 2014-08-13 2014-11-13
Prshant Sawant mumbai mumbai 2014-11-18 NULL
rohit bhora pune pune 2014-09-20 2014-11-20
sujit patil pune mumbai 2014-10-20 2014-11-20
Akshay patil pune pune 2015-09-24 NULL
查詢2:
SELECT category,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esilocation) AS ESILocation,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esidispensary) AS ESIDispensary,
Month(dateofjoining) AS month,
Year(dateofjoining) AS year,
Count(*) AS [Joining Count]
FROM dbo.employeedetail
WHERE category IN ( 1, 2 )
AND dateofjoining >= '2014-01-01'
AND dateofjoining <= '2014-12-31'
GROUP BY category,
esilocation,
esidispensary,
Month(dateofjoining),
Year(dateofjoining)
輸出:
Category ESILocation ESIDispensary month year Joining Count
1 mumbai mumbai 8 2014 1
1 pune mumbai 6 2014 1
2 pune mumbai 10 2014 1
2 pune pune 9 2014 2
查詢3:
SELECT category,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esilocation) AS ESILocation,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esidispensary) AS ESIDispensary,
Month(terminationdate) AS month,
Year(terminationdate) AS year,
Count(*) AS [Termination Count]
FROM dbo.employeedetail
WHERE category IN ( 1, 2 )
AND ( Month(terminationdate) IS NOT NULL
OR Month(terminationdate) != '' )
AND ( Year(terminationdate) IS NOT NULL
OR Year(terminationdate) != '' )
GROUP BY category,
esilocation,
esidispensary,
Month(terminationdate),
Year(terminationdate)
輸出:
Category ESILocation ESIDispensary month year Termination Count
1 mumbai mumbai 11 2014 1
1 pune mumbai 8 2014 1
2 pune mumbai 11 2014 1
2 pune pune 11 2014 2
第二和第三查詢給出終止和連接計數,預期結果應在單個表中顯示兩個計數
預期產量
Category ESILocation ESIDispensary Joining Termination Joining Termiation
Count Count Count Count
Jun-2014 jun-2014 Aug-2014 Aug-2014
1 mumbai mumbai Null Null 1 Null
1 pune mumbai 1 Null Null 1
2 pune mumbai Null Null Null Null
2 pune pune Null Null Null Null
@Update
根據@Markus Jarderot的答案,我得到此輸出
category esilocation esidispensary year month Joining Count Termination Count
1 mumbai mumbai 2014 8 1 0
1 mumbai mumbai 2014 11 0 1
1 pune mumbai 2014 6 1 0
1 pune mumbai 2014 8 1 1
2 pune mumbai 2014 10 1 0
2 pune mumbai 2014 11 0 1
2 pune pune 2014 9 2 0
2 pune pune 2014 11 0 2
但是問題是我想要這張桌子的樞軸即
預期產量
category esilocation esidispensary 8/2014 join 8/2014 term 11/2014 join 11/2014 term
1 mumbai mumbai 1 0 0 1
1 pune mumbai 1 1 null null
2 pune mumbai null null 0 1
2 pune pune null null 0 2
select data.category, cl.combovalue as esilocation, cd.combovalue as esidispensary,
year(date) as year, month(date) as month,
sum(data.joins) as [Joining Count], sum(data.terms) as [Termination Count]
from (
select category, esilocation, esidispensary, dateofjoining as date,
1 as joins, 0 as terms
from dbo.employeedetail
where dateofjoining is not null
union all
select category, esilocation, esidispensary, terminationdate as date,
0 as joins, 1 as terms
from dbo.employeedetail
where terminationdate is not null
) data
left join dbo.combovalues cl on cl.id = data.esilocation
left join dbo.combovalues cd on cd.id = data.esidispensary
where category in ( 1, 2 )
and date >= '2014-01-01'
and date <= '2014-12-31'
group by data.category, cl.combovalue, cd.combovalue, year(date), month(date)
SELECT category,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esilocation) AS ESILocation,
(SELECT combovalue
FROM dbo.combovalues
WHERE id = esidispensary) AS ESIDispensary,
Month(dateofjoining) AS month,
Year(dateofjoining) AS year,
convert(varchar,DateName(month , DateAdd( month , Month, 0 ) - 1 ))+'
'+convert(varchar,year) as DOJ
into #temp
FROM dbo.employeedetail
WHERE category IN ( 1, 2 )
AND dateofjoining >= '2014-01-01'
AND dateofjoining <= '2014-12-31'
GROUP BY category,
esilocation,
esidispensary,
Month(dateofjoining),
Year(dateofjoining)
DECLARE @cols NVARCHAR(2000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
‘],[' + t2.ColName
FROM #temp AS t2
ORDER BY '],[' + t2.ColName
FOR XML PATH('')
), 1, 2, '') + ']‘
DECLARE @query NVARCHAR(4000)
SET @query = N’SELECT tID, ’+
@cols +‘
FROM
(SELECT t1.columnname
FROM #temp AS t1 Group By DOJ
) p
PIVOT
(
Count(DOJ)
FOR ColName IN
( ’+
@cols +‘ )
) AS pvt
execute(@query)
以上查詢為您提供加入日期計數,您可以為終止日期計數做相同的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.