首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在一个表视图中具有日期值联接3表

在一个表视图中具有日期值联接3表
EN

Stack Overflow用户
提问于 2017-03-21 12:10:14
回答 1查看 65关注 0票数 1

我有3个表,其中两个表包含日期列,一个只显示日期,

第一个表-第一个表用于设置当天的发货状态。

代码语言:javascript
复制
code    status  date
------  ------  ------
JHB        v    2017-12-26
JHB        v    2017-12-27
JHB        v    2017-12-28
JHB        v    2017-12-31
PEN        v    2017-12-26
PEN        v    2017-12-27
PEN        v    2017-12-28
PEN        v    2017-12-29

第二个表是每个代码处的公共假日

代码语言:javascript
复制
code    P.H         date
------  ------      ------
JHB     Chrismas    2017-12-25
PEN     Chrismas    2017-12-25

第三张表是每个代码周末假期

代码语言:javascript
复制
code    Holiday         
------  ------  
JHB     Friday
JHB     Saturday    
PEN     Saturday
PEN     Sunday  

那么如何生成如下所示的表格。

代码语言:javascript
复制
day      JHB    PEN
------  ------  ------
25       P.H    P.H
26        v      v
27        v      v
28        v      v
29        H      v
30        H      H
31        v      H

日期安排在12月25日至12月31日之间

v- delivered状态H-假日P.H -公共假日

EN

回答 1

Stack Overflow用户

发布于 2018-06-07 06:33:07

我已经使用递归CTE为列创建了动态SQL查询。另外,我使用递归CTE来计算日期范围。为了最终的结果,我加入了公共假日和状态表,并按日期分组。希望它能有所帮助!!

Demo

代码语言:javascript
复制
EXEC(
'
-- Dynamic SQL to dynamically add the columns based on code
DECLARE @DynamicSQL VARCHAR(MAX);
DECLARE @FORMAT VARCHAR(100)= ''MAX(CASE WHEN src.code = ''''?'''' THEN COALESCE(src.status, ''''H'''') ELSE ''''H'''' END) AS ''''?'''''';
-- Populate Dynamic SQL
;WITH SDTable AS (
    SELECT ''JHB'' AS code, ''v'' AS status, CAST(''2017-12-26'' AS DATE) AS date UNION ALL
    SELECT ''JHB'', ''v'', CAST(''2017-12-27'' AS DATE) UNION ALL
    SELECT ''JHB'', ''v'', CAST(''2017-12-28'' AS DATE) UNION ALL
    SELECT ''JHB'', ''v'', CAST(''2017-12-31'' AS DATE) UNION ALL
    SELECT ''PEN'', ''v'', CAST(''2017-12-26'' AS DATE) UNION ALL
    SELECT ''PEN'', ''v'', CAST(''2017-12-27'' AS DATE) UNION ALL
    SELECT ''PEN'', ''v'', CAST(''2017-12-28'' AS DATE) UNION ALL
    SELECT ''PEN'', ''v'', CAST(''2017-12-29'' AS DATE)
),
PHTable AS (
    SELECT ''JHB'' AS code, ''Chrismas'' AS ''P.H'', CAST(''2017-12-25'' AS DATE) AS date UNION ALL
    SELECT ''PEN'', ''Chrismas'', CAST(''2017-12-25'' AS DATE)
),
WeekendTable AS (
    SELECT ''JHB'' AS code, ''Friday'' AS Holiday UNION ALL
    SELECT ''JHB'', ''Saturday'' UNION ALL
    SELECT ''PEN'', ''Saturday'' UNION ALL
    SELECT ''PEN'', ''Sunday''
),
DistinctCodeTable AS(
SELECT DISTINCT code FROM (SELECT code AS code FROM WeekendTable UNION ALL SELECT code AS code FROM PHTable UNION ALL SELECT code AS code FROM SDTable) codeTable
)
SELECT @DynamicSQL = 
    STUFF(( SELECT '','' + REPLACE(@FORMAT, ''?'', code) 
              FROM DistinctCodeTable
              FOR XML PATH('''')),1,1,'''');

-- Execute Main query with dynamic columns
EXEC(
-- Define Range
''DECLARE @D1 DATE = ''''2017-12-25'''';
DECLARE @D2 DATE = ''''2017-12-31'''';

;WITH SDTable AS (
    SELECT ''''JHB'''' AS code, ''''v'''' AS status, CAST(''''2017-12-26'''' AS DATE) AS date UNION ALL
    SELECT ''''JHB'''', ''''v'''', CAST(''''2017-12-27'''' AS DATE) UNION ALL
    SELECT ''''JHB'''', ''''v'''', CAST(''''2017-12-28'''' AS DATE) UNION ALL
    SELECT ''''JHB'''', ''''v'''', CAST(''''2017-12-31'''' AS DATE) UNION ALL
    SELECT ''''PEN'''', ''''v'''', CAST(''''2017-12-26'''' AS DATE) UNION ALL
    SELECT ''''PEN'''', ''''v'''', CAST(''''2017-12-27'''' AS DATE) UNION ALL
    SELECT ''''PEN'''', ''''v'''', CAST(''''2017-12-28'''' AS DATE) UNION ALL
    SELECT ''''PEN'''', ''''v'''', CAST(''''2017-12-29'''' AS DATE)
),
PHTable AS (
    SELECT ''''JHB'''' AS code, ''''Chrismas'''' AS ''''P.H'''', CAST(''''2017-12-25'''' AS DATE) AS date UNION ALL
    SELECT ''''PEN'''', ''''Chrismas'''', CAST(''''2017-12-25'''' AS DATE)
),
WeekendTable AS (
    SELECT ''''JHB'''' AS code, ''''Friday'''' AS Holiday UNION ALL
    SELECT ''''JHB'''', ''''Saturday'''' UNION ALL
    SELECT ''''PEN'''', ''''Saturday'''' UNION ALL
    SELECT ''''PEN'''', ''''Sunday''''
),
DistinctCodeTable AS(
SELECT DISTINCT code FROM (SELECT code AS code FROM WeekendTable UNION ALL SELECT code AS code FROM PHTable UNION ALL SELECT code AS code FROM SDTable) codeTable
),
L0 AS (SELECT 1 AS c UNION ALL SELECT 1),
L1 AS (SELECT 1 AS c FROM L0 A CROSS JOIN L0 B),
L2 AS (SELECT 1 AS c FROM L1 A CROSS JOIN L1 B),
L3 AS (SELECT 1 AS c FROM L2 A CROSS JOIN L2 B),
L4 AS (SELECT 1 AS c FROM L3 A CROSS JOIN L3 B),
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS i FROM L4)
SELECT 
src.day AS day,'' 
+ @DynamicSQL +
''
FROM 
(
-- Select Public holiday as well as status table
SELECT
 CASE WHEN ph.[P.H] IS NOT NULL THEN ph.code ELSE sd.code END AS code,
 CASE WHEN ph.[P.H] IS NOT NULL THEN ''''P.H'''' ELSE CASE WHEN sd.status IS NOT NULL THEN sd.status ELSE ''''H'''' END
 END AS status,
 DATEPART(DAY, DATEADD(day,i-1,@D1)) AS day
 FROM Nums n
 LEFT JOIN SDTable sd ON sd.date = DATEADD(day,n.i-1,@D1)
 LEFT JOIN PHTable ph ON ph.date = DATEADD(day,n.i-1,@D1)
WHERE i <= 1+DATEDIFF(day,@D1,@D2)
) src
GROUP BY src.day;'')
');

输出

代码语言:javascript
复制
day      JHB    PEN
------  ------  ------
25       P.H    P.H
26        v      v
27        v      v
28        v      v
29        H      v
30        H      H
31        v      H
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42918290

复制
相关文章

相似问题

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