Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 按大小写求和SQL GROUP BY中的重复行数_Sql Server_Sum_Case - Fatal编程技术网

Sql server 按大小写求和SQL GROUP BY中的重复行数

Sql server 按大小写求和SQL GROUP BY中的重复行数,sql-server,sum,case,Sql Server,Sum,Case,我试图对符合特定条件的所有项目进行一次求和,如下所示: 选择l.Building\u名称, 总和(当s.日期>='20180930'时,则为1,否则为0结束)已验证, 计数(不同的s.id)总计 来自实验室空间 连接s.Building_Code=l.Building_Code上的位置l 按l.建筑物名称分组 那里的计数是正确的,会说20左右,因为我可以把不同的s.id放在那里。然而,我的总和最终大约为1500。这是因为当我执行JOIN操作时,行会重复多次,因此SUM会对每一行进行计数 我如何

我试图对符合特定条件的所有项目进行一次求和,如下所示:

选择l.Building\u名称,
总和(当s.日期>='20180930'时,则为1,否则为0结束)已验证,
计数(不同的s.id)总计
来自实验室空间
连接s.Building_Code=l.Building_Code上的位置l
按l.建筑物名称分组
那里的
计数是正确的,会说20左右,因为我可以把
不同的s.id
放在那里。然而,我的
总和
最终大约为1500。这是因为当我执行
JOIN
操作时,行会重复多次,因此
SUM
会对每一行进行计数

我如何做这样的求和/事例,但确保它只适用于不同的行

s.id l.building\u name s.date
1 JF 2018-11-10
1 JF 2018-11-10
2 JF 2018-12-12

因此,如果我有这样的数据,我将正确地得到我的计数2,但validate将显示3,因为由于执行联接,
1
的id出现两次

如果您认为合适,您可以编辑临时表的代码

   create table #temp_Lab_Space
    ([Date] date null
    ,Building_Code  int null

    )

    create table #temp_Locations 
    ( Building_Code  int null
    ,Building_Name varchar(10) null
    )


        insert into #temp_Lab_Space values
        ('2018-11-10',1)
        ,('2018-11-10', 1)
        ,('2018-12-12' , 1)

        insert into #temp_Locations values
        (1, 'JF')


select Building_Name, 
       SUM(CASE WHEN Date >= '20180930' THEN 1 ELSE 0 END) Validated,
       COUNT(DISTINCT Building_Code) Total
from (
select  distinct l.Building_Name, s.Building_Code, s.Date
,Rank_1 = rank() over(partition by l.Building_Name order by s.Date asc)
FROM #temp_Lab_Space s
JOIN #temp_Locations l ON s.Building_Code = l.Building_Code
) a
group by Building_Name
胡猜

select      l.Building_Name
            , count(s.Id)
            , sum(s.Validated)
from        Locations          l
cross apply (   select      s.Id
                            , max(case
                                      when s.Date >= '20180930' then 1
                                  else 0
                                  end) as Validated
                from        Lab_Space s
                where       s.Building_Code = l.Building_Code
                group by    s.Id) s
group by l.Building_Name

应为您提供distinct space.id和一个是否验证的标志。

您可以提供一个示例数据集吗。我正在调查这件事。我可以验证我创建的临时数据;我也得到了验证=3。您的期望值是多少?您希望验证的值也计算不同的s.id?明白了;你的答案如下。让我知道这是否是你想要的。这显然适用于你的样本数据,但不幸的是,它不适用于我的全部数据。我得把你做过的事好好读一读,看看到底发生了什么事。很好,先生。很高兴你现在指出了正确的方向;)如果你能提供更多的样本数据;我也许可以编辑我的代码来覆盖它;以防我们被卡住。因此,
rank()
调用是一个麻烦,因为它实际上没有被使用,但知道通过子查询(duh:)运行它实际上是我用代码解决另一个问题后的答案;您可以将该部分插入临时表或变量(根据需要使用任何索引),然后连接回主查询。但如果它在一个期望的时间内运行,我敢肯定,逻辑作为子查询:DNope更具可读性,那么它仍然会给出远远偏离的数字。