代码之家  ›  专栏  ›  技术社区  ›  lpt

将数据透视转换为sql数据透视(代码帮助)

  •  0
  • lpt  · 技术社区  · 6 年前

    对于sql专家来说,这可能是一个非常简单的问题。但是如何将数据透视转换为sql数据透视呢(注意-我有一个巨大的数据,存储在sql中),当我试图在Jupyter Notebook中导入它以转换为pandas dataframe时,它却没有(Jupyter内核死了)。

    现在我需要帮助在SQL中透视

    这是我在熊猫中的虚拟数据和解决方案

    将numpy作为np导入

    创建假数据

    newd = {'year': [2001, 2002, 2005, 2002, 2004, 1999, 1999, 1999, 2012, 2000, 2010, 2005, 2006, 2009, 2009, 
                     2009, 2009, 2010, 2007, 2008, 2009, 2010],
         'tin': [12, 23, 24, 28,30, 12,7, 12, 12, 23, 24, 7, 12, 35, 39,37, 36, 333, 13, 13, 13, 13],
         'ptin': [12, 23, 28, 22, 12, 12,0, 12, 12, 23, 27, 45, 99, 7, 7, 7, 7, 0, 17, 21, 26, 18] }
    

    转换为df

    newdf=pd.DataFrame(newd)
    

    按付款人的纳税人识别号分组

    df=newdf.groupby(['tin', 'year'])['ptin'].groups
    print(list(df))
    print(np.unique(newdf['year'].values))
    

    按年度观察数据透视表中的分布

    print(newdf.pivot_table(index='tin', columns='year', values='ptin', aggfunc=len, fill_value=0))
    #newdf[newdf['year']==1999]
    
    year  1999  2000  2001  2002  2004  2005  2006  2007  2008  2009  2010  2012
    tin                                                                         
    7        1     0     0     0     0     1     0     0     0     0     0     0
    12       2     0     1     0     0     0     1     0     0     0     0     1
    13       0     0     0     0     0     0     0     1     1     1     1     0
    23       0     1     0     1     0     0     0     0     0     0     0     0
    24       0     0     0     0     0     1     0     0     0     0     1     0
    28       0     0     0     1     0     0     0     0     0     0     0     0
    30       0     0     0     0     1     0     0     0     0     0     0     0
    35       0     0     0     0     0     0     0     0     0     1     0     0
    36       0     0     0     0     0     0     0     0     0     1     0     0
    37       0     0     0     0     0     0     0     0     0     1     0     0
    39       0     0     0     0     0     0     0     0     0     1     0     0
    333      0     0     0     0     0     0     0     0     0     0     1     0
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Leslie Sage    6 年前

    下面介绍如何在SQL中创建假数据集(注意:数据是按SQL中的行插入的,而不是按列插入的。)

    IF OBJECT_ID('fake_data','U') IS NOT NULL 
        DROP TABLE fake_data;
    CREATE TABLE fake_data (
        [year] int
        ,[tin] int
        ,[ptin] int
    );
    INSERT INTO fake_data (
        [year]
        ,[tin]
        ,[ptin]
    )
    VALUES
        (2001,12,12),(2002,23,23),(2005,24,28),(2002,28,22),(2004,30,12),(1999,12,12)
        ,(1999,7,0),(1999,12,12),(2012,12,12),(2000,23,23),(2010,24,27),(2005,7,45)
        ,(2006,12,99),(2009,35,7),(2009,39,7),(2009,37,7),(2009,36,7),(2010,333,0)
        ,(2007,13,17),(2008,13,21),(2009,13,26),(2010,13,18);
    

    然后查看示例数据集:

    SELECT * FROM fake_data;
    

    下面是pivot的SQL查询。注意:对于列名来说,括号并不总是必要的,但是如果列名是SQL中的保留字(比如'year',一个函数),那么括号是个好主意

    SELECT
        [tin],[1999],[2000],[2001],[2002],[2004],[2005],[2006],[2007],[2008],[2009],[2010],[2012]
    FROM 
        fake_data
    PIVOT (
        COUNT([ptin])
        FOR [year]
        IN ([1999],[2000],[2001],[2002],[2004],[2005],[2006],[2007],[2008],[2009],[2010],[2012])
    ) AS myPivotTable
    ORDER BY [tin];