Sql 将列值(行)转换为列并聚合两个不同表的两行上的计数

Sql 将列值(行)转换为列并聚合两个不同表的两行上的计数,sql,sql-server,Sql,Sql Server,我有两张桌子 节目 学生 学生: Name Status1 Syear SCode -------------------- kk A 2000 1 ra A 2001 2 Paras L 2000 2 Prit L 2001 2 Poot A 2002 4 PName PCode -------------------- Msc 1 DC

我有两张桌子

  • 节目
  • 学生
  • 学生

    Name    Status1   Syear SCode
    --------------------
    kk       A       2000 1
    ra       A       2001  2
    Paras    L       2000  2
    Prit     L       2001  2
    Poot     A       2002  4
    
    PName       PCode
    --------------------
    Msc          1
    DC           2
    PO           4
    
    节目

    Name    Status1   Syear SCode
    --------------------
    kk       A       2000 1
    ra       A       2001  2
    Paras    L       2000  2
    Prit     L       2001  2
    Poot     A       2002  4
    
    PName       PCode
    --------------------
    Msc          1
    DC           2
    PO           4
    
    在ID上加入

    所需输出:

    SELECT * 
    FROM 
         (SELECT  
             Program.PName AS v, Status1
          FROM 
             Student, Program  
          WHERE 
             Student.PCode = SCode
          GROUP BY  
             Program.PName, Student.Syear, Status1) AS src
    pivot
    (
      count(v)
      FOR Status1 IN ([A],)
    ) as piv
    
    它不会在输出中显示
    PNAME

              A  L
            -----------
              1  0
              1  2
              1  0
    
    期望输出

        PNAME  A  L
        -----------
        Msc   1  0
        DC    1  2
        PO    1  0
    

    1。静态轴

    如果预先知道列名,则可以执行此操作

    SELECT PName,ISNULL([A],0) [A],ISNULL([L],0)[L] FROM 
     (
        -- Source data for pivoting
        SELECT P.PName,Status1,
        COUNT(Status1)OVER(PARTITION BY PNAME,Status1)CNT
        FROM #PROGRAM P
        JOIN #Student S ON P.PCODE=S.SCODE
     ) x
     PIVOT 
     (
         --Defines the values in each dynamic columns
         MIN(CNT)
         -- Get the names of columns to pivot
         FOR Status1 IN ([A],[L])
    ) p            
    ORDER BY PName
    
    • 查看结果
    2。动态轴心

    如果事先不知道列数,则可以进行动态数据透视

    首先,动态获取要透视的列

    DECLARE @cols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + Status1 + ']', '[' + Status1 + ']')
                   FROM    (SELECT DISTINCT Status1 FROM #Student) PV 
                   ORDER BY Status1
    
    现在,下面的变量用于将
    NULL
    替换为零

     DECLARE @NulltoZeroCols NVARCHAR (MAX)
    
    SELECT @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+Status1+'],0) AS ['+Status1+']' 
    FROM (SELECT DISTINCT Status1 FROM #Student)TAB  
    ORDER BY Status1 FOR XML PATH('')),2,8000) 
    
    现在转动它。我已经把逻辑写在里面了

    DECLARE @query NVARCHAR(MAX)
    SET @query = '-- This outer query forms your pivoted result
                 SELECT PName,'+@NullToZeroCols+' FROM 
                 (
                    -- Source data for pivoting
                    SELECT P.PName,Status1,
                    COUNT(Status1)OVER(PARTITION BY PNAME,Status1)CNT
                    FROM #PROGRAM P
                    JOIN #Student S ON P.PCODE=S.SCODE
                 ) x
                 PIVOT 
                 (
                     --Defines the values in each dynamic columns
                     MIN(CNT)
                     -- Get the names from the @cols variable to show as column
                     FOR Status1 IN (' + @cols + ')
                ) p            
                ORDER BY PName;' 
    
    EXEC SP_EXECUTESQL @query
    
    • 查看结果

    我添加了静态和动态pivot@kanwar kakkarI的代码,但在我的表中没有得到期望的结果。我刚刚将count()替换为min(),现在我得到了答案。完成了。。我会再次寻求帮助。。我是sql方面的新手:DWelcome。当然:)@kanwar kakkar-在ANSI-92 SQL标准(20多年前)中,用正确的ANSI
    JOIN
    语法替换了老式的逗号分隔表样式,不鼓励使用它。谢谢:)我以后会注意的