目前我有一个多选择查询来提取数据,这比我需要将合同长度拆分为单独的月份并且还有拆分数量。下面是当前表的简化示例:
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年,因此会有太多列,即使这样要走的路,我还是不确定如何制定这样的查询。会有任何建议吗?
谢谢你, 卢卡斯
答案 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
阅读整页,非常好,以及我的代码基于。