首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL中创建运行中的Total类函数?

如何在SQL中创建运行中的Total类函数?
EN

Stack Overflow用户
提问于 2022-04-12 16:42:03
回答 1查看 42关注 0票数 1

我对SQL非常陌生,但是Excel已经变得太慢,无法继续使用,所以我正在尝试SQLiteStudio。我希望在查询中创建一个列,显示随时间运行的总数(特征为计划点,通过项目运行时标记每个百分比)。Complete标记一个位置是否已经完成安装(Y/NULL),并且只用于从进一步的计算中筛选出不完整的位置。

我现在有

代码语言:javascript
复制
With cte as(
Select [Location]
        ,[HW/NonHW]
        ,[Obligation/Actual]
        ,[Schedule Point]
        ,[CY20$]
        ,[Vendor Name]
        ,[Vendor Zip Code]
        ,[Complete]
        ,[System Rollup (Import)]
        ,IIf([Complete] = "Y", [CY20$], 0) As [Completed Costs]

FROM data)
Select [Location]
        ,[HW/NonHW]
        ,[Obligation/Actual]
        ,[Schedule Point]
        ,[CY20$]
        ,[Vendor Name]
        ,[Vendor Zip Code]
        ,[Complete]
        ,[System Rollup (Import)]
        ,[Completed Costs]
        ,SUM([Completed Costs]) OVER (PARTITION BY [Obligation/Actual], [Normalized Schedule Location 1%],[System Rollup (Import)], [HW/NonHW]) As [CY20$ Summed]

 FROM cte

此时,我想做的不是每个调度点的和,而是所有以前的调度点(即Excel语句中的<=操作符)。

作为参考,以下是我试图复制的总结:

代码语言:javascript
复制
=SUMIFS($N$2:$N$541790,$AU$2:$AU$541790,"Y",$AQ$2:$AQ$541790,AQ2,$AI$2:$AI$541790,AI2,$AH$2:$AH$541790,AH2,$AJ$2:$AJ$541790, "<=" & AJ2)

NCY20$AUCompleteAQSystemAIObligation/ActualAHHW/NonHWAJ是调度点。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2022-04-12 17:06:34

SUMIFS等价的是SUMCASE-WHEN在SQL中的组合。

摘要示例:

代码语言:javascript
复制
SELECT
    SUM(
        CASE
            WHEN <condition1> AND <condition2> AND <condition3> THEN 1
            ELSE 0
        END
    )
FROM yourtable

在上面,condition1condition2condition3是逻辑表达式,<>只是通知您那里有一个表达式,它不是语法的一部分。这也是不必要的,有确切的三个条件,你可以有多少你喜欢。此外,没有必要使用AND作为运算符,您可以根据自己的喜好构造自己的表达式。我使用AND操作符的原因是,根据您使用SUMIFS这一事实,您可能会有一个分离。

一个更具体的例子:

代码语言:javascript
复制
CREATE TABLE person(
    number int,
    name   text,
    age    int
);

INSERT INTO person(number, name, age)
VALUES(1, 'Joe', 12);
INSERT INTO person(number, name, age)
VALUES(2, 'Jane' 12);
INSERT INTO person(number, name, age)
VALUES(3, 'Robert', 16);
INSERT INTO person(number, name, age)
VALUES(4, 'Roberta', 15);
INSERT INTO person(number, name, age)
VALUES(5, 'Blian', 18);
INSERT INTO person(number, name, age)
VALUES(6, 'Bigusdqs', 19);

SELECT 
    SUM(
        CASE
            WHEN age <= 16 AND name <> 'Joe' THEN 1
            ELSE 0
        END
    ) AS MySUMIFS
FROM person;

编辑

如果我们想知道有多少人的年龄比现在的人小,那么我们可以加入:

代码语言:javascript
复制
SELECT 
    SUM(
        CASE
            WHEN p2.age <= p1.age THEN 1
            ELSE 0
        END
    ) AS MySUMIFS, name
FROM person p1
JOIN person p2
ON p1.name <> p2.name
GROUP BY p1.name;

EDIT2

基于上面描述的思想创建了一个Fiddle,您可以在3.27&fiddle=3cb0232e5d669071a3aa5bb1df68dbca上找到它

小提琴里的密码:

代码语言:javascript
复制
CREATE TABLE person(
    number int,
    name   text,
    age    int
);

INSERT INTO person(number, name, age)
VALUES(1, 'Joe', 12);
INSERT INTO person(number, name, age)
VALUES(2, 'Jane' 12);
INSERT INTO person(number, name, age)
VALUES(3, 'Robert', 16);
INSERT INTO person(number, name, age)
VALUES(4, 'Roberta', 15);
INSERT INTO person(number, name, age)
VALUES(5, 'Blian', 18);
INSERT INTO person(number, name, age)
VALUES(6, 'Bigusdqs', 19);
SELECT 
    SUM(
        CASE
            WHEN p2.age <= p1.age THEN 1
            ELSE 0
        END
    ) AS MySUMIFS, p1.name
FROM person p1
JOIN person p2
ON p1.name <> p2.name
GROUP BY p1.name;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71846361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档