构建数据以允许第三维SQL

时间:2017-10-27 12:19:52

标签: sql sql-server-2008 pivot

目前我有一个多选择查询来提取数据,这比我需要将合同长度拆分为单独的月份并且还有拆分数量。下面是当前表的简化示例:

Month     Contract Length   Client    Client Details    Amount

Jan'17       12 months      Client1      Details 1      1200
Feb'17        3 months      Client2      Details 2      600
Nov'17       15 months      Client3      Details 3      30000

从那以后我需要收到一些看起来像的东西:

Client   Client Details |... Jan'17  Feb'17  Mar'17  Apr'17 .... Sep'17 Oct' 17  Nov'17  Dec'17...| 

Client1  Details 1            100      100     100     100         100    100      100      100
Client2  Details 2                     200     200     200
Client3  Details 3                                                                 2000    2000

考虑有一个查询来为每年的每个月添加列,然后将该单月值放入该特定列,但数据大约为8年,因此会有太多列,即使这样要走的路,我还是不确定如何制定这样的查询。会有任何建议吗?

谢谢你, 卢卡斯

2 个答案:

答案 0 :(得分:1)

如果将其传递给SSRS或类似的,那么您的查询就可以了,让您的表示层处理它。

如果您仅在SQL中需要它,那么在PIVOT TABLES上搜索信息。一旦你知道你在寻找什么,它就会有很好的记录。

答案 1 :(得分:0)

对此的数据透视表用法示例:

BEGIN TRAN

CREATE TABLE dbo.PivotExample (Country NVARCHAR(50) NULL
                                  ,Year SMALLINT NOT NULL
                                  ,SalesAmount MONEY NULL
                                  )
GO

INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Australia', 2005, 1309047.1978)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Germany', 2006, 521230.8475)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United States'
        ,2007
        ,2838512.3550
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'France', 2008, 922179.0400)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Australia', 2007, 3033784.2131)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'France', 2005, 180571.6920)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United Kingdom'
        ,2006
        ,591586.8540
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Canada', 2006, 621602.3823)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United Kingdom'
        ,2005
        ,291590.5194
        )
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United States'
        ,2005
        ,1100549.4498
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Canada', 2007, 535784.4624)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'France', 2007, 1026324.9692)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Germany', 2007, 1058405.7305)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Australia', 2006, 2154284.8835)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United Kingdom'
        ,2008
        ,1210286.2700
        )
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United States'
        ,2008
        ,3324031.1600
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Germany', 2008, 1076890.7700)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United Kingdom'
        ,2007
        ,1298248.5675
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Australia', 2008, 2563884.2900)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Canada', 2005, 146829.8074)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Germany', 2005, 237784.9902)
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'Canada', 2008, 673628.2100)
INSERT  dbo.PivotExample
        (Country
        ,Year
        ,SalesAmount
        )
VALUES  (N'United States'
        ,2006
        ,2126696.5460
        )
INSERT  dbo.PivotExample
        (Country, Year, SalesAmount)
VALUES  (N'France', 2006, 514942.0131)
GO

SELECT  *
FROM    dbo.PivotExample
ORDER BY Country
GO

SELECT  Country
,       [2005]
,       [2006]
,       [2007]
,       [2008]
,       [2009]
,       [2010]
FROM    dbo.PivotExample PIVOT
( SUM(SalesAmount) FOR Year IN ([2005], [2006], [2007], [2008], [2009], [2010]) ) P

--Declare necessary variables
DECLARE   @SQLQuery AS NVARCHAR(MAX)
DECLARE   @PivotColumns AS NVARCHAR(MAX)

--Get unique values of pivot column  
SELECT   @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME(Year)
FROM (SELECT DISTINCT Year FROM [dbo].[PivotExample]) AS PivotExample

SELECT   @PivotColumns

--Create the dynamic query with all the values for 
--pivot column at runtime
SET   @SQLQuery = 
    N'SELECT Country, ' +   @PivotColumns + '
    FROM [dbo].[PivotExample] 
    PIVOT( SUM(SalesAmount) 
          FOR Year IN (' + @PivotColumns + ')) AS P'

SELECT   @SQLQuery
--Execute dynamic query
EXEC sp_executesql @SQLQuery

ROLLBACK TRAN

归功于http://www.databasejournal.com

完整链接http://www.databasejournal.com/features/mssql/converting-rows-to-columns-pivot-and-columns-to-rows-unpivot-in-sql-server.html

阅读整页,非常好,以及我的代码基于。