回答

收藏

用日期表填写日期间隔

技术问答 技术问答 73 人阅读 | 0 人回复 | 2023-09-13

我有两张表。: k4 H  ~- e) ]+ e- E
带有客户和日期的订单表。数据仓库中的日期维度表。. y% l: z/ }' X( ]) m! D, ]/ Q
订单表并不包含给定月份中每个日期的活动,但是我需要返回一个填充日期和客户缺口的结果集。1 f$ a: U8 R( v" u4 Y% \
例如,我需要这个:
0 s$ c% _8 h, N: u' U6 T( YCustomer   Date  M, }. U; R  g  P
===============================9 F( b4 r5 {& i; _0 \3 H# G
Cust1       1/15/2012   
! A5 R' G3 r) D  `Cust1       1/18/2012
" c0 {+ I+ ]+ R! L  ]  ^Cust2       1/5/20121 J- g! z3 V3 W; E  }& {  X+ {# B
Cust2       1/8/2012
% f: F, A3 _: l4 Z$ i" B# C
( m9 `6 y$ S4 D' ]: b看起来像这样:
8 D, K5 q1 }, k! m  `$ SCustomer   Date- @; q" N8 `+ r' A7 \: \
============================
8 D7 I6 _- ~4 {' yCust1       1/15/2012   # ]7 t# O3 q( E& h+ ?  ~
Cust1       1/16/2012   9 I$ p; c; A" J1 p1 O
Cust1       1/17/2012      
. @& N8 i+ l! t7 z" ]Cust1       1/18/2012
. u) M0 i- E3 Z  G& C8 dCust2       1/5/20122 S* e! g* j" `: @, a# \8 T/ \
Cust2       1/6/2012+ s! O5 ]7 c- k' H$ |' D# B' W
Cust2       1/7/2012
* n3 _0 Z0 P! p. N' @9 kCust2       1/8/2012
9 _- N$ V) W" o3 s" H( P
- A" M: C: D# t* z, `这似乎是一个左外部联接,但它没有返回预期的结果。这是我正在使用的内容,但这并没有按预期返回日期表中的每个日期。
* }* I* s4 g. c4 @4 Y7 f! U, BSELECT o.customer, ) y) S0 b! x  P$ A. M# m
       d.fulldate
5 _( u8 Y: Z" B1 r% P: w- i! L, PFROM   datetable d
- ?1 A% n, f0 C  j9 v  p, L       LEFT OUTER JOIN orders o 9 p  b9 N4 r" \3 @- v2 G
                    ON d.fulldate = o.orderdate
( j) y9 e" B! ?& g* i1 GWHERE  d.calendaryear IN ( 2012 );
' \- }. m, \* C( v& `                0 j- m" t  Y' L4 o1 I
解决方案:. x# c, s# q1 g; v; U0 g8 m
               
1 ~4 L9 k% p- j: ^, X. K
5 E- c9 U6 s# F) K  B* _9 w; s% E, n; t& ?! U+ k
                问题是您需要所有日期的所有客户。当您执行时left outer join,customer字段将为NULL。
( P# h( e9 e/ Q7 f5 o7 i下面通过cross join输入客户名称和日期来设置驱动程序表:2 Q  ?& j! D, O% a+ [2 k
SELECT driver.customer, driver.fulldate, o.amount
) }( B6 \4 }; ~$ I5 T, M. a1 GFROM   (select d.fulldate, customer
+ Z; D# E3 e9 c1 D& L( r        from datetable d cross join, w% ?% E# R) H+ R3 M6 M1 M  a. f
             (select customer
7 e7 l, ^# o' y/ _1 _! |              from orders
7 t7 f; c7 ^; y) c              where year(orderdate) in (2012)
" a' C1 m# H, Y             ) o
8 F# [2 V# P5 V! x+ h/ y, @        where d.calendaryear IN ( 2012 )$ f" s  X) A# n( D
       ) driver LEFT OUTER JOIN! X- k$ E, \  ?* q
       orders o
" D3 X% q$ h6 `# f+ n! Y! l       ON driver.fulldate = o.orderdate and
: o7 Q+ H/ N: }9 _$ b/ q          driver.customer = o.customer;8 j2 s: ^5 y! g+ @& f$ K! _
请注意,此版本假定calendaryear与相同year(orderdate)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则