簡體   English   中英

SQL,在查詢期間根據數據條件創建新列

[英]SQL, during query create new column based on data conditions

我已經設法拼湊出一個有效的 SQL 查詢,使用聯合和表連接的組合,為我提供了我需要的臨時結果。

SELECT  n.study_id AS StudyId,
        n.practice_id AS PracticeId,
    n.FluVaxCode,
    n.Date,
    date(p.BaseStart / 1000, 'unixepoch') AS BaseStart, 
    date(p.BaseEnd / 1000, 'unixepoch') AS BaseEnd,
    date(p.OutcomeStart / 1000, 'unixepoch') AS OutcomeStart, 
    date(p.OutcomeEnd / 1000, 'unixepoch') AS OutcomeEnd,
    CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'Y' ELSE 'N' END AS BaseVax,
    CASE WHEN Date BETWEEN OutcomeStart AND OutcomeEnd THEN 'Y' ELSE 'N' END AS OutcomeVax
FROM toypractice p INNER JOIN
     (SELECT  t.study_id, t.practice_id,
     date(t.event_date / 1000, 'unixepoch') AS Date, 
     t.code_id AS FluVaxCode
     FROM toytherapy t
     WHERE t.code_id IN ('dher.', 'a6b1.', 'bk31.')
     UNION 
     SELECT  c.study_id, c.practice_id, 
     DATE(c.event_date / 1000, 'unixepoch') AS Date, 
     c.code_id AS FluVaxCode
     FROM toyclinical c
     WHERE c.code_id IN ('1383.', '229..', 'X77RW')
     ORDER BY FluVaxCode DESC
     ) n 
     ON p.practice_id = n.practice_id;

我最終得到多個列,包括三個:

Date, BaseStart, BaseEnd

所有這些都是 YYYY-MM-DD 格式(我認為)。 有沒有辦法,在查詢期間,我可以在查詢結束時添加一些代碼,以便它將在輸出中創建一個新列,這樣如果 Date 介於 BaseStart 和 BaseEnd 之間,則新列中的值將是' Y',否則新列中的值將是'N'? 在這種情況下,我使用 sqlite 進行開發/測試,但它最終必須在 mssqlserver 2019 中工作。謝謝。 Ĵ

嘗試將以下內容添加到您當前的 select 列表中:

    , CASE WHEN n.Date BETWEEN date(p.BaseStart / 1000, 'unixepoch') AND date(p.BaseEnd / 1000, 'unixepoch') THEN 'a' ELSE 'b' END AS is_between

這可以通過不同的方式來完成。 但上述應該工作。

小提琴

像這樣的東西:

sqlite的具體測試用例,作為起點。

  • cte - 提供幾行代表您當前的查詢結果
  • cte2 - 顯示我們如何將日期 (conv_date) 轉換為與基本值兼容
  • 最終查詢表達式 - 顯示如何使用從 cte2 派生的 conv_date 正確計算 BETWEEN。

請注意,我嘗試直接使用日期,這會產生錯誤的is_between結果。 is_between2顯示正確的結果。

WITH cte (date, BaseStart, BaseEnd) AS (
         SELECT 1467241200000, '2016-06-20', '2016-06-30' UNION
         SELECT 1467241200000, '2017-06-20', '2017-06-30'
     )
SELECT date(date / 1000, 'unixepoch'), BaseStart, BaseEnd
     , CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
     , CASE WHEN date(date / 1000, 'unixepoch') BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between2
  FROM cte
;

and also:

WITH cte (date, BaseStart, BaseEnd) AS (
         SELECT 1467241200000, '2016-06-20', '2016-06-30' UNION
         SELECT 1467241200000, '2017-06-20', '2017-06-30'
     )
   , cte2 AS (
         SELECT *
              , date(date / 1000, 'unixepoch') AS conv_date
           FROM cte
     )
SELECT date(date / 1000, 'unixepoch'), BaseStart, BaseEnd
     , CASE WHEN Date      BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
     , CASE WHEN conv_date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between2
  FROM cte2
;

結果:

日期(日期/1000,'unixepoch') 基礎開始 基端 在。。。之間 is_between2
2016-06-29 2016-06-20 2016-06-30 b 一個
2016-06-29 2017-06-20 2017-06-30 b b

一般回答:

SELECT Date, BaseStart, BaseEnd
     , CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
  FROM ( your SQL ) AS derived_table
;

or

WITH cte AS (
       your sql
     )
SELECT Date, BaseStart, BaseEnd
     , CASE WHEN Date BETWEEN BaseStart AND BaseEnd THEN 'a' ELSE 'b' END AS is_between
  FROM cte
;

如果您選擇的標識符與數據庫支持的 SQL 語言中的保留或關鍵字沖突,則可能需要添加引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM