首页 > 解决方案 > 在几年内对多个列使用 COUNT()

问题描述

我有一个查询,显示当年的井数。我想显示过去 5 年的计数/年。我怎么能在一个查询中做到这一点?

今年,我正在使用YEAR(GETDATE()). 在过去的五年里,我一直在想我可以使用:YEAR(GETDATE())-1、、、YEAR(GETDATE())-2YEAR(GETDATE())-23。我也认为一个CASE WHEN子句可以工作,但不知道如何在SELECT语句下使用它。

这是我当前的查询:

SELECT
    COALESCE(w.WellType, 'Totals') AS 'WellTypes',
    COUNT(DISTINCT(w.WellID)) AS '2021'
FROM Well w
    LEFT JOIN Construct c ON c.WellKey = w.PKey
    LEFT JOIN ConstructDate cd ON c.PKey = cd.ConstructKey
WHERE
    YEAR(cd.EventDate) = YEAR(GETDATE())
    AND cd.Event = 'LATERALSTATUS'
    AND cd.Comment = 'PA'
GROUP BY ROLLUP(w.WellType)
ORDER BY
    CASE w.WellType
        WHEN 'OW' THEN 1
        WHEN 'GW' THEN 2
        WHEN 'D' THEN 3
        WHEN 'OWI' THEN 4
        WHEN 'WI' THEN 5
    END DESC

这是我目前的结果:

井型 2021
威斯康星 10
OWI 1
D 21
GW 40
OW 72
总计 144

这就是我想要得到的:

井型 2021 2020 2019 2018 2017
威斯康星 10 6 0 5 2
OWI 1 2 3 6 5
D 21 0 0 2 0
GW 40 6 2 0 7
OW 72 1 2 3 4
总计 144 15 7 14 18

我正在努力在 db-fiddle 中使用它,但我以前从未使用过它。我知道这很长,但现在,这是表格中的纯数据。“EventDate”、“Comment”和“Event”列来自名为“ConstructDate”的表。“WellType”列来自名为“Well”的表。

活动日期 井型 评论 事件
2017 年 1 月 2 日 OW 功放 横向状态
2017 年 1 月 3 日 OW 功放 横向状态
2017 年 1 月 3 日 OW 功放 横向状态
2017 年 1 月 3 日 OW 功放 横向状态
2017 年 1 月 3 日 威斯康星 功放 横向状态
2017 年 1 月 3 日 威斯康星 功放 横向状态
2017 年 1 月 3 日 OWI 功放 横向状态
2017 年 1 月 3 日 OWI 功放 横向状态
2017 年 1 月 3 日 OWI 功放 横向状态
2017 年 1 月 3 日 OWI 功放 横向状态
2017 年 1 月 3 日 OWI 功放 横向状态
2017 年 1 月 4 日 GW 功放 横向状态
2017 年 1 月 4 日 GW 功放 横向状态
2017 年 1 月 5 日 GW 功放 横向状态
2017 年 1 月 5 日 GW 功放 横向状态
2017 年 1 月 5 日 GW 功放 横向状态
2017 年 1 月 5 日 GW 功放 横向状态
2017 年 1 月 5 日 GW 功放 横向状态
2018 年 1 月 1 日 威斯康星 功放 横向状态
2018 年 1 月 2 日 威斯康星 功放 横向状态
2018 年 1 月 2 日 威斯康星 功放 横向状态
2018 年 1 月 2 日 威斯康星 功放 横向状态
2018 年 1 月 2 日 威斯康星 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 OWI 功放 横向状态
2018 年 1 月 2 日 D 功放 横向状态
2018 年 1 月 2 日 D 功放 横向状态
2018 年 1 月 2 日 OW 功放 横向状态
2018 年 1 月 2 日 OW 功放 横向状态
2018 年 1 月 2 日 OW 功放 横向状态
2019 年 1 月 2 日 OWI 功放 横向状态
2019 年 1 月 2 日 OWI 功放 横向状态
2019 年 1 月 2 日 OWI 功放 横向状态
2019 年 1 月 2 日 GW 功放 横向状态
2019 年 1 月 2 日 GW 功放 横向状态
2019 年 1 月 2 日 OW 功放 横向状态
2019 年 1 月 2 日 OW 功放 横向状态
2020 年 1 月 1 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 威斯康星 功放 横向状态
2020 年 1 月 2 日 OWI 功放 横向状态
2020 年 1 月 2 日 OWI 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 GW 功放 横向状态
2020 年 1 月 2 日 OW 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 威斯康星 功放 横向状态
2021 年 8 月 16 日 OWI 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 D 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 16 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 18 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 GW 功放 横向状态
2021 年 8 月 17 日 OW 功放 横向状态
2021 年 8 月 17 日 OW 功放 横向状态
2021 年 8 月 18 日 OW 功放 横向状态
2021 年 8 月 18 日 OW 功放 横向状态
2021 年 8 月 18 日 OW 功放 横向状态
2021 年 8 月 19 日 OW 功放 横向状态
2021 年 8 月 19 日 OW 功放 横向状态
2021 年 8 月 19 日 OW 功放 横向状态
2021 年 8 月 19 日 OW 功放 横向状态
2021 年 8 月 19 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 20 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 21 日 OW 功放 横向状态
2021 年 8 月 22 日 OW 功放 横向状态
2021 年 8 月 22 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 23 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态
2021 年 8 月 24 日 OW 功放 横向状态

标签: sqlsql-servertsqlcountsql-server-2012

解决方案


当您需要不同的约束来聚合您想要的内容时,这很棘手。我不会使用计数,而是使用 CASE 语句对实例求和。这是您可以在 SQL Server 上的会话中运行的示例:

IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
    DROP TABLE #TEMP

CREATE TABLE #TEMP(
    WellType            NVARCHAR(10)
    ,EventDate          DATE
)
INSERT INTO #TEMP (WellType, EventDate)
VALUES ('OW','2021-11-03')
    ,('GW','2020-11-03')
    ,('D','2019-11-03')
    ,('OWI','2018-11-03')
    ,('WI','2017-11-03')
    ,('WI','2021-11-03')
    ,('D','2020-11-03')
    ,('D','2019-11-03')
    ,('GW','2018-11-03')
    ,('OW','2017-11-03')
    ,('OW','2021-11-03')
    ,('GW','2020-11-03')
    ,('D','2019-11-03')
    ,('OWI','2018-11-03')
    ,('WI','2017-11-03')
    ,('WI','2021-11-03')
    ,('D','2020-11-03')
    ,('D','2019-11-03')
    ,('GW','2018-11-03')
    ,('OW','2017-11-03')

SELECT 
    WellType
    ,SUM(CASE WHEN YEAR(EventDate) = YEAR(GETDATE()) THEN 1 ELSE 0 END) [THIS YEAR]
    ,SUM(CASE WHEN YEAR(EventDate) = YEAR(DATEADD(YEAR,-1,GETDATE())) THEN 1 ELSE 0 END) [LAST YEAR]
    ,SUM(CASE WHEN YEAR(EventDate) = YEAR(DATEADD(YEAR,-2,GETDATE())) THEN 1 ELSE 0 END) [2 YEARS AGO]
    ,SUM(CASE WHEN YEAR(EventDate) = YEAR(DATEADD(YEAR,-3,GETDATE())) THEN 1 ELSE 0 END) [3 YEARS AGO]
FROM #TEMP
GROUP BY WellType

我还使用 GETDATE() 函数来确定要求和的年份。这应该做你想要的。

SELECT 语句之前和之后的输出: 在此处输入图像描述


推荐阅读