簡體   English   中英

在SQL中使用分組依據獲取多個字段的計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM