我在 SQL Server 2019 中有兩個表
表日歷:
| 日期日歷 |
|---|
| 01-01-22 |
| 02-01-22 |
| 03-01-22 |
| 04-01-22 |
| 05-01-22 |
| 06-01-22 |
還有一個有責任的事實表用戶:
| 用戶 | 日期作業 | 義務 |
|---|---|---|
| 1 | 04-01-22 | 美國廣播公司 |
| 1 | 04-01-22 | 定義 |
| 2 | 03-01-22 | xyz |
| 2 | 03-01-22 | fgt |
| 2 | 04-01-22 | 拖把 |
| 1 | 05-01-22 | 射頻 |
| 2 | 06-01-22 | 圖伊 |
這是預期的結果:
| 日期 | 用戶 | 日期作業 | 義務 |
|---|---|---|---|
| 01-01-22 | 1 | 空值 | 空值 |
| 01-01-22 | 2 | 空值 | 空值 |
| 02-01-22 | 1 | 空值 | 空值 |
| 02-01-22 | 2 | 空值 | 空值 |
| 03-01-22 | 1 | 空值 | 空值 |
| 03-01-22 | 2 | 03-01-22 | xyz |
| 03-01-22 | 2 | 03-01-22 | fgt |
| 04-01-22 | 1 | 04-01-22 | 美國廣播公司 |
| 04-01-22 | 1 | 04-01-22 | 定義 |
| 04-01-22 | 2 | 04-01-22 | 拖把 |
| 05-01-22 | 1 | 05-01-22 | 射頻 |
| 05-01-22 | 2 | 空值 | 空值 |
| 06-01-22 | 1 | 空值 | 空值 |
| 06-01-22 | 2 | 06-01-22 | 圖伊 |
我試過這個:
WITH PWR as
(
SELECT
user,date_work,duty
FROM Fact_Table
),
calendar as
(
select date_calendar
from Dim_Calendar
)
select
date_calendar
,pwr.user
,pwr.date_work
,pwr.duty
from calendar
left join pwr on calendar.date_calendar = pwr.date_work
uj5u.com熱心網友回復:
不需要您的 CTE,它除了給表名起別名外什么都不做。
然后,為了保證每個日期都有每個用戶,無論他們是否在作業,您需要將日期串列與用戶串列交叉連接。
假設你有一個用戶表,這給了......
SELECT
calendar.date_calendar
,user.user
,pwr.date_work
,pwr.duty
FROM
dim_calendar AS calendar
CROSS JOIN
dim_user AS user
LEFT JOIN
fact_table AS pwr
ON pwr.date_work = calendar.date_calendar
AND pwr.user = user.user
然后,如果您需要按日期或用戶進行過濾,您可以在 where 子句中包含維度表(而不是事實表)。
uj5u.com熱心網友回復:
如果你沒有一張Dim_Users桌子,你當然可以模擬一張:
;WITH Dim_Users AS
(
SELECT [user]
FROM dbo.Fact_Table
GROUP BY [user]
)
SELECT * FROM Dim_Users
CROSS JOIN dbo.Dim_Calendar AS dates
LEFT OUTER JOIN dbo.Fact_Table AS f
ON f.date_work = dates.date_calendar
AND Dim_Users.[user] = f.[user]
ORDER BY dates.date_calendar, Dim_Users.[user];
uj5u.com熱心網友回復:
看起來您需要從每個唯一作業日期和用戶的主串列開始。
select distinct
c.date_calendar,
f.user
from
calendar c
cross join fact f
現在,這可以成為所有可能的日期和用戶的基礎。現在,只需在日期/用戶組合上重新左連接回用戶表
select
AllUniq.date_calendar,
AllUniq.user,
f2.date_work,
f2.duty
from
( select distinct
c.date_calendar,
f.user
from
calendar c
cross join fact f ) AllUniq
LEFT JOIN fact f2
on AllUniq.date_calendar = f2.date_work
AND AllUniq.user = f2.user
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443360.html
上一篇:根據其他記錄更新記錄
