首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有declare的sql视图

带有declare的sql视图
EN

Stack Overflow用户
提问于 2014-07-26 04:21:04
回答 4查看 24.8K关注 0票数 1

我需要在视图中使用它,但它似乎不能使用声明。帮助?

代码语言:javascript
复制
declare @lastsat datetime
set @lastsat = 
(select max(fechahoy) from [BigArea].[Thing].[Expanded]    where DiaSemana='Saturday')

SELECT a.*,
case
when b.fecha_gestion = a.fechahoy and month(fechahoy)!=month(getdate()) then 1
when a.fechahoy = @lastsat then 1
else 0
end as FinDeMEs
  FROM [BigArea].[Thing].[Expanded] a 
  join [BigArea].[dbo].[fechas_gestion] b 
  on a.fechahoy = b.fecha
EN

回答 4

Stack Overflow用户

发布于 2014-07-26 04:30:27

出于性能原因,我倾向于在值中使用join

代码语言:javascript
复制
select e.*,
       (case when g.fecha_gestion = e.fechahoy and month(fechahoy) <> month(getdate()) then 1
             when e.fechahoy = m.fechahoy then 1
             else 0
        end) as FinDeMEs
from [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida] e join
     [AreaComercial].[dbo].[fechas_gestion] g
      on e.fechahoy = g.fecha cross join
      (select max(fechahoy) as fechahoy
       from [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida]
       where DiaSemana = 'Saturday'
      ) m;

我还建议您对表别名使用表缩写。

顺便说一句,您可能可以用窗口函数替换逻辑:

代码语言:javascript
复制
select e.*,
       (case when g.fecha_gestion = e.fechahoy and month(fechahoy) <> month(getdate()) then 1
             when e.fechahoy = max(case when e.diasemana = 'Saturday' then e.fechahoy end)
             then 1
             else 0
        end) as FinDeMEs
from [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida] e join
     [AreaComercial].[dbo].[fechas_gestion] g
      on e.fechahoy = g.fecha;

这并不是100%保证的,因为join可能正在进行一些过滤。但它很可能会有效地解决你的问题。

票数 2
EN

Stack Overflow用户

发布于 2014-07-26 04:43:22

您可以创建一个Table Valued函数,然后将查询放入其中,并在视图中选择它,

代码语言:javascript
复制
CREATE FUNCTION FUNCTION_NAME ( )
RETURNS  @retContactInformation TABLE
(
-- YOUR COUMN DEFINATIONS HERE
)
AS

    declare @lastsat datetime
set @lastsat = 
(select max(fechahoy) from [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida]    where DiaSemana='Saturday')

SELECT a.*,
case
when b.fecha_gestion = a.fechahoy and month(fechahoy)!=month(getdate()) then 1
when a.fechahoy = @lastsat then 1
else 0
end as FinDeMEs
  FROM [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida] a 
  join [AreaComercial].[dbo].[fechas_gestion] b 
  on a.fechahoy = b.fecha

GO

然后在您的视图中:

代码语言:javascript
复制
SELECT * FROM FUNCTION_NAME()
票数 2
EN

Stack Overflow用户

发布于 2014-07-26 04:24:43

你不能直接修改你的SQL来避免变量声明吗?

代码语言:javascript
复制
SELECT a.*,
case
  when b.fecha_gestion = a.fechahoy and month(fechahoy)!=month(getdate()) then 1
  when a.fechahoy = (select max(fechahoy) from [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida]    where DiaSemana='Saturday')
    then 1
  else 0
end as FinDeMEs
FROM [AreaComercial].[LARRA_DOM\Mpollak].[Canales_expandida] a 
join [AreaComercial].[dbo].[fechas_gestion] b on a.fechahoy = b.fecha
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24963891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档