2014-09-29 96 views
1

我有一個查詢,可以查看36個月的單位銷售歷史記錄。它按原樣工作,但我想知道是否有辦法使它不那麼冗長和麻煩。簡化SQL SELECT語句?

查詢有兩個部分 - 標題和數據。

以下是我對頭:

SELECT 
DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AS "MM36" 
, DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AS "MM35" 
, DATEADD(m, -34, GETDATE()-day(GETDATE()-1)) AS "MM34" 

截至今天,這是月 - 2011年它繼續至11月...

, DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AS "MM03" 
, DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AS "MM02" 
, DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AS "MM01" 

6至8月2014年。36行代碼。是

拉單元的銷售數據報表如下:

, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -35, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty36" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -34, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty35" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -34, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -33, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty34" 

截至今天,這是月 - 2011年它繼續至11月...

, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -02, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty03" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -01, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty02" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -00, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty01" 

2014年6月 - 8月。

在完成此報表之前,我將添加更多內容,以便儘可能保持整潔。

感謝,

編輯

下面的例子說明,上面的代碼,我能得到我想要的東西(沒有代表張貼圖片,所以我不得不做鏈接)。它還表明,與透視表我缺少我的物品號碼和滾動月份。我如何添加這兩件事?

Example

我試着去掉了「ItemTable」。「ItemNum」字段如下,但它並不在我的水晶報表顯示出來。我試圖說的任何地方,我得到「無法綁定」的錯誤。

select 
[0] MM00 
, [1] MM01 
, [2] MM02 
, ... 
from (
select 
    "ItemTable"."ItemNum",DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
, "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
from your_table 
) as source 
pivot 
(
sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

再次感謝。

+0

進行一個月的查詢並將其包裝在WHILE循環中,該循環的增量從1增加到36. – 2014-09-29 15:46:29

回答

2

這種情況對於Pivot table似乎已經成熟。

沿

select 
    [0] MM00 
    , [1] MM01 
    , [2] MM02 
    , ... 
from (
    select 
     DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

編輯

東西線細化例子:包括項目號是相當直截了當;只需將其包含在select語句中。

select 
    "ItemTable"."ItemNum" 
    , [0] MM00 
    , [1] MM01 
    , [2] MM02 
    , ... 
from (
    select 
     "ItemTable"."ItemNum" 
    , DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

有你的支點列動態名字是相當困難。總的想法是,你必須將SQL構建爲一個字符串並動態執行它。谷歌搜索會產生許多結果(如a SQL Hints blog)。一些不完整的代碼給你的一般想法是。

SET @DynamicPivotQuery = 
N'select 
    "ItemTable"."ItemNum" 
    , [' + @Name1 + '] 
    , [' + @Name2 + '] 
    , [' + @NameN + '] 
from (
    select 
     "ItemTable"."ItemNum" 
     /* search MSDN for the best date formatting algorithm */ 
    , CONVERT_TO_STRING("SalesTable"."SalesDate") month 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For month in (
     [' + @Name1 + '] 
    , [' + @Name2 + '] 
    , [' + @NameN + '] 
) 
) as PivotTable'; 

--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 
+0

欣賞反饋。像這樣的東西肯定更有效。看到我上面的編輯,我可以闡述我到目前爲止的內容。 – SOSteppenwolf 2014-10-01 21:34:41

+0

太棒了。有ItemNum顯示。唯一不同的是我要在第一個SELECT操作符下面放置表名(「ItemTable」)。不知道那裏的理由,但它的工作原理。我將不得不使用動態名稱來查看是否可以使其工作。儘管如此,你幫助我取得了進展,非常感謝。 – SOSteppenwolf 2014-10-03 21:53:42