我有以下查询,它将一个表中的数据与另一个表进行比较。现在事实证明,查询 A 可能不会返回记录,所以在 A.Week 和 S.Week 之间的 WHERE V.Week 中,如果 A.Week 不包含任何内容,我需要输入数字 27。有什么想法吗?谢谢问候
IdUser Codigo Cantidad
112 02158 225
112 02422 25
112 03173 80
112 03353 550
112 03739 701
以下是我的代码:
select V.IdUser, V.Codigo, sum(V.Cantidad) as Cantidad
FROM (select max(S.Semana) as Semana, V.IdUser, V.Codigo from SVisitas V
left join Calendario S ON V.Fecha between S.Inicio and S.Fin
group by V.IdUser, V.Codigo)A
left join (select * from(select IdUser,Codigo,Temporada,SUM(Cantidad)
as Cantidad,Semana from SCantidadesP group by IdUser,Codigo,Temporada,Cantidad,Semana)V
where V.Cantidad <> 0)V on A.IdUser=V.IdUser and A.Codigo=V.Codigo
left join (Select * from Calendario where Getdate() between Inicio and
Fin)S on V.Temporada=S.Temporada WHERE V.Semana between A.Semana and
S.Semana
group by V.IdUser,V.Codigo
这些是我的板
SVisitas
IdUser int
Codigo varchar(5)
Fecha datetime
Calendario
Semana int
Inicio datetime
Fin datetime
Temporada int
SCantidadesP
IdUser int
Codigo varchar(5)
Cantidad int
Semana int
Temporada int
在这里我留下一个我的表存储的数据示例,我需要的是查看我的 SCantidadesP 表的所有记录,即使代码不在 SVisitas 表中
SVisitas
IdUser Codigo Fecha
112 02158 2019-11-12
112 02422 2019-12-03
Calendario
Temporada Semana Inicio Fin
1920 45 2019-11-04 2019-11-10
1920 46 2019-11-11 2019-11-17
1920 47 2019-11-18 2019-11-24
1920 48 2019-11-25 2019-12-01
1920 49 2019-12-02 2019-12-08
1920 50 2019-12-09 2019-12-15
1920 51 2019-12-16 2019-12-22
1920 52 2019-12-23 2019-12-29
SCantidadesP
IdUser Codigo Cantidad Semana Temporada
112 02158 234 50 1920
112 02458 1000 45 1920
112 02565 654 45 1920
112 02157 287 51 1920
112 02159 098 49 1920
如果您需要在某个地方将可能为空的字段的值替换为另一个值...您将需要使用 SQL SERVER 的 ISNULL 函数。
用法是这样的:
这样,当 MY_COLUMN_NULL 的值为 null 时,null 将被替换为 27。
更正以使其适应表格的正确顺序:
文档页面: https ://docs.microsoft.com/es-es/sql/t-sql/functions/isnull-transact-sql?view=sql-server-ver15
我通过一个博客链接完成了答案,该博客非常清楚地解释了如何使用连接:inner left right full join works
在这里,您将看到为什么现在应该出现您想要的数据,以及 A.Week 将如何为空,因此您必须使用 ISNULL(A.Week, 27)
希望有帮助,最好的问候!
您可以在他们的表格中进行修改
嗨亨茨伯格:你可以这样做。我只想告诉你,集合 A 是什么,理解你需要的是 A,返回一个结果,它的 Week = 27,但它的 idUser 和它的代码将为 0。
基本上,对于 SVisits 和日历查询,我们添加一行,其中包含一周的 27。
在这个名为 u 的集合的输出上,我们使用一个窗口函数来获取 U 中有多少条记录。
在这个名为 u2 的集合的输出中,我们过滤如果行数 > 1,我们会收集 Svisits 和 Calendar 的所有记录,因为我们选择那些具有订单列 1 的记录,如果它只有 1 条记录,那么我们收集订单0 即 27。
所以 U2 将是您的集合 A,然后您的查询将按原样继续。