0

我需要创建一个回答以下问题的查询:

我想返回阅读日期为 26 天的注册数量,阅读日期为 27 天的条目数,最多为 31 天,过去 6 个月。我需要你保持这样的状态:

我的预期输出是这样的:

LOCALE   COMPETENCE    Reading_date(DAYS)     INSCRIPTION (Quantity)
------    ----         ----------             ---------
CEARA    JAN18          26                      20
CEARA    JAN18          27                      02
CEARA    JAN18          28                      34
CEARA    JAN18          29                      07
CEARA    JAN18          30                      12
CEARA    JAN18          31                      11
CEARA    FEV18          26                      21
CEARA    FEV18          27                      09

(去...)

但我的桌子是这样的:

INSCRIP  COMPETENCE     Reading_date
00183938    201801      2018-01-02
00183938    201802      2018-02-01
00183946    201709      2017-09-01
00183946    201710      2017-10-01
00183946    201711      2017-11-01

我正在尝试的我的 sql 是这样的(请抽象连接):

select top 10   LOCALE
               , COMPETENCE
               , lead(Reading_date, 1) over (PARTITION by Reading_date ORDER BY Reading_date) next_lecture
               , datediff(day, Reading_date, next_lecture) Reading_date
               , INSCRIPTION
from BASE o
join LOCALE l
on u.localidade = l.cod_localidade
group by LOCALE, COMPETENCE, Reading_date, INSCRIPTION

有人帮帮我吗?感谢和抱歉英语不好

4

1 回答 1

1

我发表了评论,但我也会将其作为答案发布。该错误非常不言自明:

消息 207,级别 16,状态 1,第 27 行无效的列名称“next_lecture”。

您的表中没有列next_lecture。那是因为,就像我在评论中所说:

您正在尝试SELECT通过别名引用您的另一个字段;你不能那样做。

您可以通过查询本身的别名来引用字段的唯一位置(因此不在它之外,例如在使用子查询时)是在ORDER BY子句中;其他任何地方都会导致错误。因此,像这样的简单语句将失败:

SELECT 1 + 1 AS Two, Two * 2 AS Four;

您必须提供完整的表达式,因此:

SELECT 1 + 1 AS Two, (1 + 1) * 2 AS Four;    

结果,您的查询变为:

SELECT DISTINCT TOP 10
       LOCALE,
       COMPETENCE
       LEAD(Reading_date, 1) OVER (PARTITION by Reading_date ORDER BY Reading_date) AS next_lecture
       DATEDIFF(DAY, Reading_date, LEAD(Reading_date, 1) OVER (PARTITION by Reading_date ORDER BY Reading_date)) Reading_date
       INSCRIPTION
FROM BASE o
     JOIN LOCALE l ON u.localidade = l.cod_localidade;

请注意,我还删除了GROUP BY并使用了DISTINCT. 您的查询中没有聚合函数,所以我认为这就是您尝试使用它的目的。

编辑:随机猜测OP想要什么,但它没有到达那里。我已经添加了这个供他们参考,但是,事情还不清楚:

WITH VTE AS (
    SELECT INSCRIP,COMPETENCE,CONVERT(date,reading_date) AS Reading_date
    FROM (VALUES('00183938',201801,'20180102'),
                ('00183938',201802,'20180201'),
                ('00183946',201709,'20170901'),
                ('00183946',201710,'20171001'),
                ('00183946',201711,'20171101')) V(INSCRIP,COMPETENCE,reading_date))
SELECT COMPETENCE,
       LEAD(Reading_Date) OVER (/*PARTITION BY LOCALE*/ ORDER BY Reading_Date) AS next_lecture,
       DATEDIFF(DAY,Reading_date, LEAD(Reading_Date) OVER (/*PARTITION BY LOCALE*/ ORDER BY Reading_Date)) AS ReadingDate,
       INSCRIP
FROM VTE
ORDER BY Reading_date ASC
于 2018-03-20T14:19:22.290 回答