Sql 为订购的月份创建分类
我正试图在查询中创建一列,以显示相对于日期的有序分类(显示1、2、3(如第一、第二、第三…)。。。在我当前的查询中,我过滤了过去12个月的数据(例如,从2016年9月1日到2017年8月31日) 使用Sql 为订购的月份创建分类,sql,sql-server,date,Sql,Sql Server,Date,我正试图在查询中创建一列,以显示相对于日期的有序分类(显示1、2、3(如第一、第二、第三…)。。。在我当前的查询中,我过滤了过去12个月的数据(例如,从2016年9月1日到2017年8月31日) 使用DATEADD(mm;DATEDIFF(m;-1;GETDATE())-12;0) 第一次约会 DATEADD(s;-1;DATEADD(mm;DATEDIFF(m;0;GETDATE())+1;0)) 当前月份的最后一天。我还有两列,一列是月份,另一列是年份,都是从数据中的文档日期列中提取的(我使
DATEADD(mm;DATEDIFF(m;-1;GETDATE())-12;0)
第一次约会
DATEADD(s;-1;DATEADD(mm;DATEDIFF(m;0;GETDATE())+1;0))
当前月份的最后一天。我还有两列,一列是月份,另一列是年份,都是从数据中的文档日期列中提取的(我使用
月(dbo.Mov\u Venda\u Cab.dtmData)
和年(dbo.Mov\u Venda\u Cab.dtmData))
我的目标是有一个专栏,展示如下内容:
如果该月是间隔的第一个月(如果是第9个月和2016年),则必须显示1,如果是第二个月(第10个月和2016年),则显示2,全部连续到当前月份(即2017年第8个月)并显示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)
选择DISTINCT DATEADD(mm,DATEDIFF(m,-1,GETDATE())-12,0)作为数据INI,
DATEADD(s,-1,DATEADD(mm,DATEDIFF(m,0,GETDATE())+1,0))作为数据,
dbo.Mov_Venda_Lin.Id,
月(dbo.Mov_Venda_Cab.dtmData)作为Mes,
年份(dbo.Mov_Venda_Cab.dtmData)作为年份,
dbo.Mov_Venda_Lin.fltValorMercadoriaSIVA*dbo.Mov_Venda_Cab.intSinal AS Mercadoria,
dbo.Mov_Venda_Lin.fltValorLiquido*dbo.Mov_Venda_Cab.intSinal AS ValorLiquido,
案例
当tbl_tipos_documentos.bitconsideraqtdmapas=1时
然后(Mov_Venda_Lin.fltQuantidade*Mov_Venda_cab.intsinal)
其他0
以Quantidade结尾,
作为第三方,第三方为第三方,
dbo.Mov_Venda_Lin.Strabrevtoc作为TpDoc,
dbo.Tbl_Tipos_Documentos.strDescricao作为描述文件,
以林哈的身份,在林荫大道上行走,
作为行使人的债务,
dbo.Mov_Venda_Cab.strAbrevMoeda作为Moeda,
dbo.Mov_Venda_Cab.fltCambio作为Cambio,
作为Artigo的strCodArtigo,
dbo.Tbl_Gce_Artigos.strDescricao作为DescArtigo,
dbo.Mov_Venda_Lin.strCodClassMovStk作为MovStk,
dbo.Tbl_classificacomovstk.strDescricao作为说明,
案例
当mov_venda_cab.inttpentidade=0时
然后tbl_gce_tipos_entidade.strcodigo
否则无效
以TpEntidade结尾,
案例
当mov_venda_cab.inttpentidade=0时
然后tbl_gce_tipos_entidade.strdescricao
否则无效
以DescTpEntidade结尾,
案例
当mov_venda_cab.intcodentidade 0
然后是mov_venda_cab.intcodentidade
否则无效
以CodEntidade结尾,
案例
当mov_venda_cab.inttpentidade=0时
和mov_venda_cab.intcodentidade 0
然后是“客户”
当mov_venda_cab.inttpentidade=1时
和mov_venda_cab.intcodentidade 0
然后是“奥特罗·德维多”
否则无效
以TipoEntidade结尾,
案例
当mov_venda_cab.inttpentidade=0时
然后是tbl_客户
否则,我就不知道了
以笛卡尔命名结束,
dbo.Tbl_亚区。斯特拉布列夫佐纳作为佐纳,
dbo.Tbl_Zonas.strDescricao作为DescZona,
dbo.Mov_Venda_Cab.strAbrevSubZona作为SubZona,
dbo.Tbl_SubZonas.strDescricao作为DescSubZona,
dbo.Mov_Venda_Cab.intcod作为卖方,
dbo.Tbl_Gce_Vendedores.strNome作为名称,
dbo.Tbl_Gce_Artigos.strCodCategoria作为Categoria,
dbo.Tbl_Gce_Categorias.strDescricao作为DescCategoria,
dbo.Tbl_Gce_Artigos.strTpArtigo作为TpArtigo,
dbo.Tbl_Gce_Tipos_Artigos.strDescricao作为描述部分,
强制转换(NULL为VARCHAR(13))为CodFamiliaAgrup,
强制转换(NULL为VARCHAR(35))为DescFamAgrup,
将(空为VARCHAR(13))转换为CodFamilies,
强制转换(NULL为VARCHAR(35))为DescFamRes,
dbo.Mov_Venda_Cab.strForteAbrevMoeda作为abrevmoeda,
dbo.Mov_Venda_Cab.fltForteCambio作为fortecambio
来自dbo.Mov_Venda_Lin和(NOLOCK)
左外连接dbo.Mov\U Venda\U驾驶室(无锁)
在dbo.Mov_Venda_Lin.strCodSeccao=dbo.Mov_Venda_Cab.strCodSeccao上
和dbo.Mov_Venda_Lin.strabrevtpodoc=dbo.Mov_Venda_Cab.strabrevtpodoc
和dbo.Mov_Venda_Lin.strcodexercio=dbo.Mov_Venda_Cab.strcodexercio
和dbo.Mov_Venda_Lin.intNumero=dbo.Mov_Venda_Cab.intNumero
左外连接dbo.Tbl_Gce_Armazens与(NOLOCK)
关于dbo.Mov_Venda_Lin.strCodArmazem=dbo.Tbl_Gce_Armazens.strCodigo
左外连接dbo.Tbl_Gce_Artigos与(NOLOCK)
关于dbo.Tbl_Gce_Artigos.strCodigo=dbo.Mov_Venda_Lin.strCodigo
左外连接dbo.Tbl\U Gce\U ArtigosFamilias与(NOLOCK)
关于dbo.Tbl_Gce_Artigos.strCodigo=dbo.Tbl_Gce_Artigos familias.strCodigo
左外连接dbo.Tbl_Gce_Familias WITH(NOLOCK)
关于dbo.Tbl\u Gce\u ArtigosFamilias.strCodFamilia=dbo.Tbl\u Gce\u Familias.strCodigo
左外连接dbo.Tbl_Gce_artigosreferenceas与(NOLOCK)
关于dbo.Tbl\u Gce\u Artigos.strCodigo=dbo.Tbl\u Gce\u Artigos referenceas.strCodArtigo
左外连接dbo.Tbl\u Gce\u引用(NOLOCK)
关于dbo.Tbl\u Gce\u artigosreferenceas.strcodreferenceia=dbo.Tbl\u Gce\u referenceas.strCodigo
左外连接dbo.Tbl\U Gce\U Tipos\U Artigos与(NOLOCK)
关于dbo.Tbl\u Gce\u Artigos.strTpArtigo=dbo.Tbl\u Gce\u Tipos\u Artigos.strCodigo
左外连接dbo.Tbl_客户与(NOLOCK)
在dbo.Mov_Venda_Cab.intCodEntidade=dbo.Tbl_Clientes.intCodigo上
左外连接dbo.Tbl_Direccoes与(NOL
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
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
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