【问题标题】:How to convert the CTEs to temporary tables or subqueries. PostgreSQL to Microsoft SQL如何将 CTE 转换为临时表或子查询。 PostgreSQL 到 Microsoft SQL
【发布时间】:2021-10-20 04:59:00
【问题描述】:
WITH
date_range AS (
SELECT '2020-03-01'::date AS start_date, '2020-04-01'::date AS end_date
),
start_accounts AS
(
SELECT account_id, SUM(mrr) AS total_mrr
FROM subscription s INNER JOIN date_range d ON
s.start_date<= d.start_date
AND (s.end_date>d.start_date or s.end_date is null)
GROUP BY account_id
),
end_accounts AS
(
SELECT account_id, SUM(mrr) AS total_mrr
FROM subscription s INNER JOIN date_range d ON
s.start_date<= d.end_date
AND (s.end_date>d.end_date or s.end_date is null)
GROUP BY account_id
),
retained_accounts AS
(
SELECT s.account_id, SUM(e.total_mrr) AS total_mrr
FROM start_accounts s
INNER JOIN end_accounts e ON s.account_id=e.account_id
GROUP BY s.account_id
),
start_mrr AS (
SELECT SUM (start_accounts.total_mrr) AS start_mrr
FROM start_accounts
),
retain_mrr AS (
SELECT SUM(retained_accounts.total_mrr) AS retain_mrr
FROM retained_accounts
)
SELECT
retain_mrr /start_mrr AS net_mrr_retention_rate,
1.0 - retain_mrr /start_mrr AS net_mrr_churn_rate,
start_mrr,
retain_mrr
FROM start_mrr, retain_mrr

【问题讨论】:

  • 我不明白这个问题。 Postgres 和 SQL Server 都支持 CTE。
  • 好像只需要修改第一个CTE SELECT cast('2020-03-01' as date) AS start_date, cast('2020-04-01' as date) AS end_date。所有其他都可以“按原样”使用
  • 我在这个查询中看到的唯一一个 SQL Server 不支持的就是这个语法'2020-03-01'::date,我假设 sis PostgreSql 用这种方式说这是一个日期数据类型。如果我的假设是正确的,那么 SQL Server 的等价物是 CAST('2020-03-01' AS date)
  • 我不清楚你到底在问什么。您需要修复 Postgres 查询中的问题吗?您是否需要编写一个在 Postgres 和 SQL Server 中无需更改即可工作的查询?是否需要将 Postgres 查询迁移到 SQL Server?
  • 这个查询是针对 Postgres 的。我想在 Microsoft SQL 上创建。

标签: sql sql-server postgresql database-migration


【解决方案1】:

Expression:targettype 转换是用于类型转换的 postgresql 特定语法。但是,您必须使用 ANSI 语法 CAST(Expression AS targettype) 或特定于 SQL Server 的 CONVERT(targettype,Expression) 才能使其在 SQL Server 中工作。

您需要在第一个 CTE 中使用单独的 CAST 才能在 SQL Server 中工作。

发件人:

WITH
date_range AS (
SELECT '2020-03-01'::date AS start_date, '2020-04-01'::date AS end_date
)

收件人:

WITH
date_range AS (
SELECT CAST('2020-03-01' as date) AS start_date, cast('2020-04-01' AS date) AS end_date
)

or

WITH
date_range AS (
SELECT CONVERT(date,'2020-03-01') AS start_date, CONVERT(DATE,'2020-04-01') AS end_date
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2020-03-06
    • 2012-02-08
    相关资源
    最近更新 更多