Sql server 2012 复杂的分组或案例陈述让我头痛

Sql server 2012 复杂的分组或案例陈述让我头痛,sql-server-2012,grouping,Sql Server 2012,Grouping,我在SQL Server 2012中工作,我试图实现以下三种形式的标准,我希望这是有意义的 使用与下面类似的数据,如果我有两份合同,每行的每个用户代码的总价值>0,那么结果我需要是“多份合同”,例如下面的站点52、70、309,如果我有两个合同,其中只有一行的总价值>0,那么结果将是总价值>0的用户的合同名称,例如Site 520,最后如果我有一个合同,其中只有一行,那么这只会导致给定的合同名称,例如Site 600 Site UserCode User Name

我在SQL Server 2012中工作,我试图实现以下三种形式的标准,我希望这是有意义的

使用与下面类似的数据,如果我有两份合同,每行的每个用户代码的总价值>0,那么结果我需要是“多份合同”,例如下面的站点52、70、309,如果我有两个合同,其中只有一行的总价值>0,那么结果将是总价值>0的用户的合同名称,例如Site 520,最后如果我有一个合同,其中只有一行,那么这只会导致给定的合同名称,例如Site 600

Site  UserCode   User Name             Contract Name         Total Val
----------------------------------------------------------------------
52    10000123   Miss Brenda Smith     Perm Contract         425.00
52    10000123   Miss Brenda Smith     Temp Contract         772.00
70    10000300   Mr Paul Jones         Perm Contract         877.00
70    10000300   Mr Paul Jones         Another Contract       29.00
309   10000297   Mrs Annette Curtain   Yet Another Contract  255.00
309   10000297   Mrs Annette Curtain   Perm Contract          61.00
520   10000140   Miss Alison Smith     Perm Contract         425.00
520   10000140   Miss Alison Smith     Temp Contract           0.00
600   10000200   Mr Steve Myself       Perm Contract         100.00

这对我来说是一个严重的头痛,我撞到了墙,无法做到这一点,这让我发疯,如果有人能帮助我,我会很高兴的。我尝试过各种各样的案例陈述,但是我的大脑崩溃了。它可能很简单,但盯着它看了这么久,我就看不见了。

把它分解成逻辑部分。我想不出一个查询可以处理您的条件,所以我写了3,并将它们结合在一起

这不是完美的,但很管用

declare @contracts table
(
  Site         INT,
  UserCode     INT,
  UserName     VARCHAR(100),
  ContractName VARCHAR(100),
  TotalVal     MONEY
);


INSERT INTO @contracts (Site,UserCode,UserName,ContractName,TotalVal) VALUES
(52, 10000123, 'Miss Brenda Smith',   'Perm Contract',        425.00),
(52, 10000123, 'Miss Brenda Smith',   'Temp Contract',        772.00),
(70, 10000300, 'Mr Paul Jones',       'Perm Contract',        877.00),
(70, 10000300, 'Mr Paul Jones',       'Another Contract',     29.00),
(309,10000297, 'Mrs Annette Curtain', 'Yet Another Contract', 255.00),
(309,10000297, 'Mrs Annette Curtain', 'Perm Contract',        61.00),
(520,10000140, 'Miss Alison Smith',   'Perm Contract',        425.00),
(520,10000140, 'Miss Alison Smith',   'Temp Contract',        0.00),
(600,10000200, 'Mr Steve Myself',     'Perm Contract',        100.00);

select t1.Site, UserCode, UserName, 'multiple contracts', SUM(TotalVal) as totalvalue
from @contracts t1
join (select site from @contracts where TotalVal>0 group by Site having COUNT(*)>1) as morethan1greater0
   on t1.Site=morethan1greater0.Site
group by t1.Site, UserCode, UserName
union all
select t1.Site, UserCode, UserName, ContractName, SUM(t1.TotalVal) as totalvalue
from @contracts t1
join (select site, sum(TotalVal) TotalVal from @contracts group by Site having COUNT(*)>1) as morethan1only1greater0
   on t1.Site=morethan1only1greater0.Site
   and t1.TotalVal=morethan1only1greater0.TotalVal
group by t1.Site, UserCode, UserName, ContractName
union all
select t1.Site, UserCode, UserName, ContractName, SUM(TotalVal) as totalvalue
from @contracts t1
join (select site from @contracts group by Site having COUNT(*)=1) as only1
   on t1.Site=only1.Site
group by t1.Site, UserCode, UserName, ContractName

您的文本缺少详细信息。您的问题到底是什么?看起来您需要捕获逻辑的代码,但您没有说得很清楚?你是用什么语言工作的,或者说这是无关的?嗨,对不起,描述有点混乱,我已经添加了这个,希望它能有点意义。我在SQL 2012中,需要代码方面的帮助,以根据给出的示例数据进行计算。好吧,首先,这里有一个示例,但也许您想向我们展示您尝试过的内容,以及它如何不是您想要的内容?这些语句已经被弄乱了,它们现在根本不起作用,这整件事我真的很难处理。