Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何编写数据透视表以列形式显示每年的记录?_Sql Server_Sql Server 2005_Tsql_Pivot_Crosstab - Fatal编程技术网

Sql server 如何编写数据透视表以列形式显示每年的记录?

Sql server 如何编写数据透视表以列形式显示每年的记录?,sql-server,sql-server-2005,tsql,pivot,crosstab,Sql Server,Sql Server 2005,Tsql,Pivot,Crosstab,我很确定我需要一个支点来做这件事,但我不太明白。(sql newb) 我有这样的数据: ID CompanyID Year Revenue Expenses 1 0003 2011 12000 4000 2 0003 2010 9000 6000 3 0003 2009 7000 9000 4 0010 2011 134

我很确定我需要一个支点来做这件事,但我不太明白。(sql newb)

我有这样的数据:

ID    CompanyID    Year    Revenue    Expenses
1     0003         2011    12000      4000
2     0003         2010    9000       6000
3     0003         2009    7000       9000
4     0010         2011    134300     34000
5     0010         2010    43000      46000
6     0010         2009    73000      39000
CompanyID    2011-Revenue    2010-Revenue    2009-Revenue    2011-Expenses   2010-Expenses    2009-Expenses
0003         12000           9000            7000            4000            6000             9000
0010         134300          43000           73000           34000           46000            39000
我是否可以使用透视来显示此表,如下所示:

ID    CompanyID    Year    Revenue    Expenses
1     0003         2011    12000      4000
2     0003         2010    9000       6000
3     0003         2009    7000       9000
4     0010         2011    134300     34000
5     0010         2010    43000      46000
6     0010         2009    73000      39000
CompanyID    2011-Revenue    2010-Revenue    2009-Revenue    2011-Expenses   2010-Expenses    2009-Expenses
0003         12000           9000            7000            4000            6000             9000
0010         134300          43000           73000           34000           46000            39000
这是我到目前为止所拥有的

SELECT P1.*
FROM    (SELECT [CompanyID]
            ,CASE P.[Year] WHEN 2011 THEN P.[Revenue] ELSE NULL END AS '2011-Revenue'
            ,CASE P.[Year] WHEN 2010 THEN P.[Revenue] ELSE NULL END AS '2010-Revenue'
    FROM tblRecords P WHERE P.[CompanyID] = @companyID GROUP BY CompanyID, [Year], [Revenue]) AS P1
它正在返回:

CompanyID    2011-Revenue    2010-Revenue 
0003         12000           NULL
0003         NULL            9000
我的结果有一些问题

  • 公司ID 0003有两条记录,我想把它归为一条记录

  • 我一次只能选择一家公司,我需要选择多家。我试过了

    FROM tblRecords P
    WHERE P.[CompanyID] IN (@CompanyIDs)
    GROUP BY CompanyID, [Year], [Revenue]) AS P1
    
    其中,
    @CompanyIDs
    是一个类似于
    '00030010'
    的字符串-它没有失败,但结果只是一个带有标题且没有数据的空表

  • 任何帮助都将不胜感激。。或者让我知道我是否误解了你

    非常感谢

    托马斯

    编辑:使用Microsoft SQL Server Management Studio 2005 Express

    更新2:我已经找到了连接表的更多细节,但是我仍然需要能够以逗号分隔的字符串形式传入companyID。。在此方面的任何帮助都将不胜感激

    VVVV我已经在下面找到了这个(一切正常后将发布)VVVV

    更新:看起来鲁本的建议会起作用,但是我刚刚决定我需要更多的功能来实现这一点。。。我可以将此表与另一个表合并以获得标题吗

      CompanyID    CompanyName    CompanyAddress    2011-Revenue    2010-Revenue 
    
    其中CompanyName和CompanyAddress来自另一个表(tblCompanyDetails)

    我试过使用:

    SELECT *
    FROM 
    (
        SELECT  CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Revenue' Type,
                Revenue Value FROM tblRecords
        FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
        UNION ALL
        SELECT  CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Expenses' Type,
                Expenses  Value FROM tblRecords 
        FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
    ) src
        PIVOT
    (
        SUM(Value) for [Type] in
    ([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
         [2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
    )
    ) pvt
    WHERE CompanyID = @CompanyID
    
    我得到一个错误:

    Msg 1038, Level 15, State 4, Procedure spCompare, Line 10
    An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name. 
    
    试试这个:

    DECLARE @CompanyIDs XML
    DECLARE @Records  TABLE
    (
        ID int,
        CompanyID char(4),
        Year int,
        Revenue decimal,
        Expenses decimal
    )
    DECLARE @CompanyDetails TABLE
    (
        CompanyID char(4),
        Name varchar(50),
        Address varchar(50)
    )
    
    SET @CompanyIDs = '
    <filter>
        <CompanyID>0003</CompanyID>
        <CompanyID>0010</CompanyID>
    </filter>'
    
    INSERT INTO @Records 
    (ID, CompanyID, Year, Revenue, Expenses)VALUES 
    (1, '0003', 2011, 12000 , 4000 ),
    (2, '0003', 2010, 9000  , 6000 ),
    (3, '0003', 2009, 7000  , 9000 ),
    (4, '0010', 2011, 134300, 34000),
    (5, '0010', 2010, 43000 , 46000),
    (6, '0010', 2009, 73000 , 39000)
    
    INSERT INTO @CompanyDetails 
    (CompanyID, Name, Address) VALUES
    ('0003', 'Company A', 'A Street'),
    ('0010', 'Company B', 'B Street')
    
    SELECT *
    FROM 
    (
        SELECT  CompanyID, CAST(YEAR AS varchar) + ' - Revenue' Type,
                Revenue Value FROM @Records 
        UNION ALL
        SELECT  CompanyID, CAST(YEAR AS varchar) + ' - Expenses' Type,
                Expenses  Value FROM @Records 
    ) src
    PIVOT
    (
        SUM(Value) for [Type] in
        ([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
         [2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
        )
    ) pvt
    JOIN    @CompanyDetails Details
        ON  Details.CompanyId = pvt.CompanyID
    WHERE   pvt.CompanyID IN
    (
        SELECT  T.C.value('.', 'char(4)')
        FROM    @CompanyIDs.nodes('/filter/CompanyID') T(C)
    )
    
    DECLARE@CompanyIDs XML
    声明@Records表
    (
    ID int,
    公司ID字符(4),
    整年,
    收入小数,
    费用小数
    )
    声明@CompanyDetails表
    (
    公司ID字符(4),
    名称varchar(50),
    地址:varchar(50)
    )
    SET@CompanyIDs='1〕
    0003
    0010
    '
    插入@Records
    (ID、公司ID、年份、收入、费用)值
    (1, '0003', 2011, 12000 , 4000 ),
    (2, '0003', 2010, 9000  , 6000 ),
    (3, '0003', 2009, 7000  , 9000 ),
    (4, '0010', 2011, 134300, 34000),
    (5, '0010', 2010, 43000 , 46000),
    (6, '0010', 2009, 73000 , 39000)
    插入到@CompanyDetails中
    (公司ID、名称、地址)值
    (‘0003’、‘A公司’、‘A街’),
    (‘0010’、‘B公司’、‘B街’)
    挑选*
    从…起
    (
    选择CompanyID,CAST(年份为varchar)+“-Revenue”类型,
    来自@Records的收入价值
    联合所有
    选择CompanyID,CAST(年份为varchar)+“-Expenses”类型,
    来自@Records的费用价值
    )src
    支点
    (
    中[Type]的总和(值)
    ([2011-收入]、[2010-收入]、[2009-收入],
    [2011-费用],[2010-费用],[2009-费用]
    )
    )pvt
    加入@CompanyDetails详细信息
    关于Details.CompanyId=pvt.CompanyId
    私人公司在哪里
    (
    选择T.C.值(‘.’,‘字符(4)’)
    来自@CompanyID.nodes('/filter/CompanyID')T(C)
    )
    

    您需要将公司筛选器作为XML发送,并根据透视操作的需要使用该子选择来断开数据。对于连接操作,只需使用
    pvt
    output

    是的,对不起,我包括了TSQL标记,但可以更具体一些。Micorsoft SQL Server 2005我觉得在服务器上只进行分组,然后在客户端应用程序中对结果进行交叉制表,通常更为灵活。看起来这会起作用。但是,我在最后添加了CompanyID=@CompanyID,这样就可以将所有年度数据放在一行,然而,当我在(@CompanyIDs)中添加WHERE CompanyID时,它并没有出错,只是返回了一个空表,您知道如何使WHERE子句工作吗?非常感谢您让我走到这一步。感谢您的更新,我将尝试使用xml-我非常感谢您的帮助。。请参阅更新,了解我在初始问题中遗漏的一点。。。非常感谢你。