2017-08-09 44 views
2

我試圖在我的查詢中創建一個列,以顯示相對於日期的有序分類(顯示1,2,3(如第一,第二,第三...))。 。在我的當前查詢我已經使用DATEADD(mm; DATEDIFF(m; - 1; GETDATE()) - 12; 0)創建一個月的訂購分類

用於第一日期和

過濾從過去12個月的數據(如例如,從2016年1月9日至31-8-2017) DATEADD(s; - 1; DATEADD(mm; DATEDIFF(m; 0; GETDATE()) + 1; 0))

爲當月的最後一天。我也有兩列,一個與月和其他同一年,無論從當前的文檔日期列中的數據(提取我使用

MONTH(dbo.Mov_Venda_Cab.dtmData)YEAR(dbo.Mov_Venda_Cab.dtmData))

我的目標是有一個列顯示如下:

如果月份是第一個來自間隔(如果是第9個月和第2016年)必須顯示1,如果是第二個(第10個月和第2016年),顯示2,全部持續到當前月份(即8年和2017年)並顯示12.

如果值靜態我可以做一個簡單的案例,並會達到我想要的。我的問題是,因爲當我得到根據當前日期和12個月後過濾的數據時,我無法得到相同的結果,因爲我不知道CASE表達式中應該做什麼。

,以便它可以幫助我的欄目有:

Item ; Qty ; Month ; Year ; dtmData ; orderedMonth 

原始查詢:

SELECT DISTINCT DATEADD(mm, DATEDIFF(m, - 1, GETDATE()) - 12, 0)       AS DATA_INI, 
    DATEADD(s,       - 1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0)) AS DATA_FIM, 
    dbo.Mov_Venda_Lin.Id, 
    MONTH(dbo.Mov_Venda_Cab.dtmData)          AS Mes, 
    YEAR(dbo.Mov_Venda_Cab.dtmData)          AS Ano, 
    dbo.Mov_Venda_Lin.fltValorMercadoriaSIVA * dbo.Mov_Venda_Cab.intSinal AS Mercadoria, 
    dbo.Mov_Venda_Lin.fltValorLiquido  * dbo.Mov_Venda_Cab.intSinal AS ValorLiquido, 
    CASE 
    WHEN tbl_tipos_documentos.bitconsideraqtdmapas = 1 
    THEN (Mov_Venda_Lin.fltQuantidade * mov_venda_cab.intsinal) 
    ELSE 0 
    END          AS Quantidade, 
    dbo.Mov_Venda_Lin.strCodSeccao   AS Seccao, 
    dbo.Mov_Venda_Lin.strAbrevTpDoc   AS TpDoc, 
    dbo.Tbl_Tipos_Documentos.strDescricao AS DescTpDoc, 
    dbo.Mov_Venda_Lin.intNumLinha   AS Linha, 
    dbo.Mov_Venda_Lin.strCodExercicio  AS Exercicio, 
    dbo.Mov_Venda_Cab.strAbrevMoeda   AS Moeda, 
    dbo.Mov_Venda_Cab.fltCambio    AS Cambio, 
    dbo.Mov_Venda_Lin.strCodArtigo   AS Artigo, 
    dbo.Tbl_Gce_Artigos.strDescricao   AS DescArtigo, 
    dbo.Mov_Venda_Lin.strCodClassMovStk  AS MovStk, 
    dbo.Tbl_ClassificacaoMovStk.strDescricao AS DescMovStk, 
    CASE 
    WHEN mov_venda_cab.inttpentidade = 0 
    THEN tbl_gce_tipos_entidade.strcodigo 
    ELSE NULL 
    END AS TpEntidade, 
    CASE 
    WHEN mov_venda_cab.inttpentidade = 0 
    THEN tbl_gce_tipos_entidade.strdescricao 
    ELSE NULL 
    END AS DescTpEntidade, 
    CASE 
    WHEN mov_venda_cab.intcodentidade <> 0 
    THEN mov_venda_cab.intcodentidade 
    ELSE NULL 
    END AS CodEntidade, 
    CASE 
    WHEN mov_venda_cab.inttpentidade = 0 
    AND mov_venda_cab.intcodentidade <> 0 
    THEN 'Cliente' 
    WHEN mov_venda_cab.inttpentidade = 1 
    AND mov_venda_cab.intcodentidade <> 0 
    THEN 'Outro Devedor' 
    ELSE NULL 
    END AS TipoEntidade, 
    CASE 
    WHEN mov_venda_cab.inttpentidade = 0 
    THEN tbl_clientes.strnome 
    ELSE tbl_outros_devedores.strnome 
    END         AS DescNome, 
    dbo.Tbl_SubZonas.strAbrevZona   AS Zona, 
    dbo.Tbl_Zonas.strDescricao    AS DescZona, 
    dbo.Mov_Venda_Cab.strAbrevSubZona  AS SubZona, 
    dbo.Tbl_SubZonas.strDescricao   AS DescSubZona, 
    dbo.Mov_Venda_Cab.intCodVendedor  AS Vendedor, 
    dbo.Tbl_Gce_Vendedores.strNome   AS DescNomeVend, 
    dbo.Tbl_Gce_Artigos.strCodCategoria AS Categoria, 
    dbo.Tbl_Gce_Categorias.strDescricao AS DescCategoria, 
    dbo.Tbl_Gce_Artigos.strTpArtigo  AS TpArtigo, 
    dbo.Tbl_Gce_Tipos_Artigos.strDescricao AS DescTpArtigo, 
    CAST(NULL AS VARCHAR(13))    AS CodFamiliaAgrup, 
    CAST(NULL AS VARCHAR(35))    AS DescFamAgrup, 
    CAST(NULL AS VARCHAR(13))    AS CodFamiliaRes, 
    CAST(NULL AS VARCHAR(35))    AS DescFamRes, 
    dbo.Mov_Venda_Cab.strForteAbrevMoeda AS abrevmoeda, 
    dbo.Mov_Venda_Cab.fltForteCambio  AS fortecambio 
FROM dbo.Mov_Venda_Lin WITH (NOLOCK) 
LEFT OUTER JOIN dbo.Mov_Venda_Cab WITH (NOLOCK) 
    ON dbo.Mov_Venda_Lin.strCodSeccao  = dbo.Mov_Venda_Cab.strCodSeccao 
    AND dbo.Mov_Venda_Lin.strAbrevTpDoc = dbo.Mov_Venda_Cab.strAbrevTpDoc 
    AND dbo.Mov_Venda_Lin.strCodExercicio = dbo.Mov_Venda_Cab.strCodExercicio 
    AND dbo.Mov_Venda_Lin.intNumero  = dbo.Mov_Venda_Cab.intNumero 
LEFT OUTER JOIN dbo.Tbl_Gce_Armazens WITH (NOLOCK) 
    ON dbo.Mov_Venda_Lin.strCodArmazem = dbo.Tbl_Gce_Armazens.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Artigos WITH (NOLOCK) 
    ON dbo.Tbl_Gce_Artigos.strCodigo = dbo.Mov_Venda_Lin.strCodArtigo 
LEFT OUTER JOIN dbo.Tbl_Gce_ArtigosFamilias WITH (NOLOCK) 
    ON dbo.Tbl_Gce_Artigos.strCodigo = dbo.Tbl_Gce_ArtigosFamilias.strCodArtigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Familias WITH (NOLOCK) 
    ON dbo.Tbl_Gce_ArtigosFamilias.strCodFamilia = dbo.Tbl_Gce_Familias.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_ArtigosReferencias WITH (NOLOCK) 
    ON dbo.Tbl_Gce_Artigos.strCodigo = dbo.Tbl_Gce_ArtigosReferencias.strCodArtigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Referencias WITH (NOLOCK) 
    ON dbo.Tbl_Gce_ArtigosReferencias.strCodReferencia = dbo.Tbl_Gce_Referencias.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Tipos_Artigos WITH (NOLOCK) 
    ON dbo.Tbl_Gce_Artigos.strTpArtigo = dbo.Tbl_Gce_Tipos_Artigos.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Clientes WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.intCodEntidade = dbo.Tbl_Clientes.intCodigo 
LEFT OUTER JOIN dbo.Tbl_Direccoes WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.intCodEntidade = dbo.Tbl_Direccoes.intCodigo 
    AND dbo.Mov_Venda_Cab.intDireccao = dbo.Tbl_Direccoes.intNumero 
    AND dbo.Mov_Venda_Cab.intTpEntidade = dbo.Tbl_Direccoes.intTp_Entidade 
LEFT OUTER JOIN dbo.Tbl_Outros_Devedores WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.intCodEntidade = dbo.Tbl_Outros_Devedores.intCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Vendedores WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.intCodVendedor = dbo.Tbl_Gce_Vendedores.intCodigo 
LEFT OUTER JOIN dbo.Tbl_Tipos_Documentos WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.strAbrevTpDoc = dbo.Tbl_Tipos_Documentos.strAbreviatura 
LEFT OUTER JOIN dbo.Tbl_SubZonas WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.strAbrevSubZona = dbo.Tbl_SubZonas.strAbreviatura 
LEFT OUTER JOIN dbo.Tbl_Zonas WITH (NOLOCK) 
    ON dbo.Tbl_SubZonas.strAbrevZona = dbo.Tbl_Zonas.strAbreviatura 
LEFT OUTER JOIN dbo.Tbl_Gce_Categorias WITH (NOLOCK) 
    ON dbo.Tbl_Gce_Artigos.strCodCategoria = dbo.Tbl_Gce_Categorias.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Seccoes WITH (NOLOCK) 
    ON dbo.Mov_Venda_Cab.strCodSeccao = dbo.Tbl_Gce_Seccoes.strCodigo 
LEFT OUTER JOIN dbo.Tbl_Gce_Tipos_Entidade WITH (NOLOCK) 
    ON dbo.Tbl_Clientes.strTpEntidade = dbo.Tbl_Gce_Tipos_Entidade.strCodigo 
LEFT OUTER JOIN dbo.Tbl_ClassificacaoMovStk WITH (NOLOCK) 
    ON dbo.Mov_Venda_Lin.strCodClassMovStk = dbo.Tbl_ClassificacaoMovStk.strCodigo 
WHERE (dbo.Mov_Venda_Cab.intTpEntidade = 0 
    OR dbo.Mov_Venda_Cab.intTpEntidade IS NULL) 
    AND (dbo.Mov_Venda_Cab.strAbrevTpDoc       IN ('CRFCX', 'FACIV', 'FACTC', 'FCTA', 'LANIV', 'LOFX', 'LONC', 'LXANI', 'NCFCX', 'NFACC', 'NFACE', 'NFACM', 'NFACT', 'NNCRC', 'NNCRE', 'NNCRM', 'NNDEB', 'NNDEC', 'NNDEV', 'NVDIC', 'NVDIN', 'XLACC', 'XLACD')) 
    AND (dbo.Mov_Venda_Cab.strCodSeccao        IN ('1', 'ENCT1', 'ENCT2', 'ENCT3', 'ENCT4', 'ENCT5', 'ENCT6')) 
    AND (dbo.Mov_Venda_Cab.dtmData   > DATEADD(mm, DATEDIFF(m, - 1, GETDATE()) - 12, 0)) 
    AND (dbo.Mov_Venda_Cab.dtmData  <= DATEADD(s,    - 1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))) 
    AND (dbo.Mov_Venda_Lin.intTpLinha  > 2) 
    AND (dbo.Mov_Venda_Cab.bitAnulado  = 0) 
    AND (dbo.Mov_Venda_Cab.bitConvertido = 0) 
+0

什麼數據庫服務器?請列出您當前的查詢 –

+0

Sql Server 2012 ...原始查詢是要在這裏張貼... –

+0

添加原始查詢(對不起,有點長...這就是爲什麼我簡化了它... –

回答

1

幸運的是還有比用一堆CASE陳述一個更復雜的方法。您可以使用ROW_NUMBER函數。

首先,不要將你的日期分成月份和年份。只需使用Getdate()即可計算出您想要的範圍,並將您的來源日期與該日期進行比較。然後你添加ROW_NUMBER,讓您排序輸出:

SELECT 
    * 
    ,ordered_output = (ROW_NUMBER()OVER(PARTITION BY grouping_field ORDER BY cast(dtmData as datetime) ASC)) 
FROM Mov_Venda_Cab 
WHERE cast(dtmData as datetime) >= getdate() - 365 

這個例子假設你有一定的ID字段或類似上您希望將你的輸出,通過在例如grouping_field表示。您的結果會是什麼樣子:

grouping_field dtmData ordered_output 
1    8/1/2017  1 
1    8/2/2017  2 
1    8/3/2017  3 
2    8/1/2017  1 
2    8/2/2017  2 
2    8/3/2017  3 

如果你不希望你的組輸出,只要按日期排序的一切,你可以省略PARTITION BY grouping_field文本。你會得到,而不是這樣的:

dtmData ordered_output 
8/1/2017  1 
8/2/2017  2 
8/3/2017  3 
8/4/2017  4 
8/5/2017  5 
8/6/2017  6 

編輯:提問者澄清說,同月的所有記錄應該得到同樣的有序輸出。

要做到這一點,你首先需要指定每月/年組合一個等級,並重新加入到使用子查詢的兩層主表:您正在使用

SELECT b.*, c.month_rank 
from Mov_Venda_Cab as b 
inner join 
    (select mnt, yr, ROW_NUMBER() OVER(ORDER BY A.yr, A.mnt) AS month_rank 
    from (
     SELECT DISTINCT 
      MONTH(dtmData) as mnt 
      , YEAR(dtmData) as yr 
     from Mov_Venda_Cab 
     WHERE cast(dtmData as datetime) >= getdate() - 365 
     ) as a 
    ) as c 
on MONTH(b.dtmData) = c.mnt and YEAR(b.dtmData) = c.yr 
+0

幾乎工作...有序的輸出應該按月完成,所以如果我使用分區(ROW_NUMBER()OVER(PARTITION BY mov_venda_cab.dtmdata ORDER BY mov_venda_cab.dtmdata ASC)作爲分類)我得到的所有行數爲1 ...如果我放棄PARTITION我得到所有行編號asn 1,2,3,4,... 128999,依此類推...因爲按行分組而不是按月份/年分組。 –

+0

我不確定我是誰完全理解你的問題在這裏,但如果你想按月分組,你可以從'dtmData'和分區中抽出月份 – Rominus

+0

我做到了這一點......並且幾乎得到了我想要的結果從 得到所有行 我是什麼想要的是: –