-2

我需要一个查询来仅在日期参数之间提取第一个实例和最后一个实例。
我有一个记录财务信息的表格,其中的财务年度结束日期字段Company通过链接到表格companyID。每个公司还链接到programme表,可以有多个程序。我有一份报告可以在某些程序上提取每家公司的财务状况,我已将其调整为仅提取第一个和最后一个实例(使用 MIN 和 MAX),但是我需要第一个实例。在某个日期参数之后和某个日期参数之前的最后一个实例。

示例:ALoggs 公司有 1999,2000,2001,2004,2006,2007,2009 的财务,但该程序从 2001 年到 2007 年运行,所以我只想要这些年份之间的第一个财务记录和最后一个财务记录,即 2001 年和 2007 年的记录。任何帮助表示赞赏。目前我正在使用 2 个查询,因为我急需数据,但我需要在 1 个查询中使用它,并且仅在财政年度结束日期在参数之间且仅在公司至少有 2 条 GVA 记录的情况下才需要它。

查询1

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover, 
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover, 
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (
        SELECT
            ccx_companyname, 
            MAX(ccx_financialyearenddate) AS LatestDate
        FROM Filteredccx_gva AS Filteredccx_gva_1
        GROUP BY ccx_companyname
    ) AS min_1 
INNER JOIN Filteredccx_gva AS gva 
    ON min_1.ccx_companyname = gva.ccx_companyname AND 
       min_1.LatestDate = gva.ccx_financialyearenddate
WHERE (gva.ccx_status = ACTUAL)

查询2:

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover,
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover,
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (
         SELECT
             ccx_companyname, 
             MIN(ccx_financialyearenddate) AS FirstDate
         FROM Filteredccx_gva AS Filteredccx_gva_1
         GROUP BY ccx_companyname
    ) AS MAX_1 
INNER JOIN Filteredccx_gva AS gva 
    ON MAX_1.ccx_companyname = gva.ccx_companyname AND 
       MAX_1.FirstDate = gva.ccx_financialyearenddate
WHERE (gva.ccx_status = ACTUAL)
4

3 回答 3

0

你不能只使用第一个和最后一个日期参数添加一个 where 子句。像这样的东西:

SELECT <companyId>, MIN(<date>), MAX(<date>)
FROM <table>
WHERE <date> BETWEEN @firstDate AND @lastDate
GROUP BY <companyId>
于 2013-03-22T12:26:25.840 回答
0
declare @programme table (ccx_companyname varchar(max), start_year int, end_year int);
insert @programme values
('ABloggs', 2001, 2007);

declare @companies table (ccx_companyname varchar(max), ccx_financialyearenddate int);
insert @companies values
 ('ABloggs', 1999)
,('ABloggs', 2000)
,('ABloggs', 2001)
,('ABloggs', 2004)
,('ABloggs', 2006)
,('ABloggs', 2007)
,('ABloggs', 2009);

select c.ccx_companyname, min(ccx_financialyearenddate), max(ccx_financialyearenddate)
from @companies c
join @programme p on c.ccx_companyname = p.ccx_companyname
where c.ccx_financialyearenddate >= p.start_year and c.ccx_financialyearenddate <= p.end_year
group by c.ccx_companyname
having count(*) > 1;
于 2013-03-22T15:06:50.043 回答
0

通过在虚拟表的同一个 GROUP BY 查询中包含 MIN 和 MAX 聚合,您可以将两个原始查询组合成一个查询。还包括 COUNT( ) 和 HAVING COUNT( ) > 1 确保公司必须至少有 2 个日期。所以查询应该是这样的:

SELECT 
    gva.ccx_companyname, 
    gva.ccx_depreciation, 
    gva.ccx_exportturnover,
    gva.ccx_financialyearenddate, 
    gva.ccx_netprofitbeforetax, 
    gva.ccx_totalturnover,
    gva.ccx_totalwages, 
    gva.ccx_statusname, 
    gva.ccx_status, 
    gva.ccx_company, 
    gva.ccx_totalwages + gva.ccx_netprofitbeforetax + gva.ccx_depreciation AS GVA, 
    gva.ccx_nofulltimeequivalentemployees
FROM 
    (SELECT
         ccx_companyname,
         ccx_status,
         MIN(ccx_financialyearenddate) AS FirstDate,
         MAX(ccx_financialyearenddate) AS LastDate,
         COUNT(*) AS NumDates
     FROM Filteredccx_gva AS Filteredccx_gva_1
     WHERE (ccx_status = ACTUAL)
     GROUP BY ccx_companyname, ccx_status
     HAVING COUNT(*) > 1
    ) AS MinMax
INNER JOIN Filteredccx_gva AS gva 
      ON MinMax.ccx_companyname = gva.ccx_companyname AND 
         (MinMax.FirstDate = gva.ccx_financialyearenddate OR
          MinMax.LastDate = gva.ccx_financialyearenddate)
WHERE (gva.ccx_status = MinMax.ccx_status)
ORDER BY gva.ccx_companyname, gva.ccx_financialyearenddate
于 2013-03-25T15:07:19.047 回答