我有以下记录
Jobsite | UID | Name | Rate | Amount | Amount2 | DateProcessed | FOrigin
'X' 111 'Billy' 100 250 900 '2014-5-23' '1'
'Y' 111 'Billy' 100 350 100 '2014-5-23' '2'
'Z' 222 'Dan' 200 200 200 '2014-5-23' '3'
'Z' 222 'Dan' 200 200 200 '2014-5-23' '4'
我将如何根据UID,名称,费率和DateProcessed对其进行汇总?我仍然需要为未编目的列输出虚拟记录,如Jobsite和Fileorigin。
输出应该是:
Jobsite | UID | Name | Rate | Amount | Amount2 | DateProcessed | FOrigin
'X' 111 'Billy' 100 600 1000 '2014-5-23' 'x'
'X' 222 'Dan' 200 400 400 '2014-5-23' 'x'
我尝试了这个查询:
select 'x' as Jobsite, UID, Name, Rate, Sum(Amount) as Amount, Sum(Amount2) as
Amount2, DateProcessed, 'x' as FOrigin from TblExample where DateProcessed = '2014-5-23'
group by UID, Name, Rate, DateProcessed;
但它仍然输出相同的记录。 我应该如何总结这一点?我应该通过vb.net循环吗?
答案
要分组的字符串中的“细微差别”是关键。名为“Ann”的员工肯定与“Anne”不同,这就是为什么他们没有在查询中组合在一起。
我所做的只是删除了分组列表中的名称和速率,并使用了Max()。
答案 0 :(得分:1)
您的查询:
select 'x' as Jobsite, UID, Name, Rate, Sum(Amount) as Amount,
Sum(Amount2) as Amount2, DateProcessed, 'x' as FOrigin
from TblExample
where DateProcessed = '2014-5-23'
group by UID, Name, Rate, DateProcessed;
不应该生成四列不同的行:UID
,Name
,Rate
,DateProcessed
。
您只是明确选择了DateProcessed
的一个值,所以这不是问题。问题是其他三个专栏之一。我的猜测是rate
是一个浮点数,实际上包含两个不同的值,在输出时看起来相同。你可以尝试:
select 'x' as Jobsite, UID, Name, max(Rate), Sum(Amount) as Amount,
Sum(Amount2) as Amount2, DateProcessed, 'x' as FOrigin
from TblExample
where DateProcessed = '2014-5-23'
group by UID, Name, DateProcessed;
否则,Name
可能有尾随空格或未打印字符,使不同的名称看起来不同。或者UID可能会有细微差别。
答案 1 :(得分:1)
如果我要解释你的问题,那么你要求能够按UID进行分组,但仍然可以输出其他每一列。 在这种情况下,您必须在UID上执行GROUP BY,并在每列上执行某种聚合函数。
现在,有一些简单的,比如Rate,Amount和Amount2,你在其中提供了你想在这些列上使用SUM(聚合)。
对于其他列,例如DateProcessed和FOrigin,你可以对它们执行MIN或MAX,它实际上取决于你想从这些列中检索哪些数据,因为你必须假设你已经折叠了两个或者更多行。
然后在像Jobsite和Name这样的列上变得更有趣。你可以使用第一行的值,但是然后谁说Jobsite'X'比Jobsite'Y'更“重要”。另一种方法是将它们连接起来。因此,如果您的前两行折叠为一,您的Jobsite列可能是'X,Y'。您可以使用用户定义的函数完成连接。
答案 2 :(得分:1)
Malky,你的查询是正确的,不是吗?
我复制了你的sql并尝试了,想要你想要的结果。
DECLARE @A TABLE
(
JOBSITE CHAR(1),
UID INT,
NAME CHAR(10),
RATE INT,
AMOUNT INT,
AMOUNT2 INT,
DATEPROCESSED DATE,
FORIGIN CHAR(1)
)
INSERT INTO @A VALUES
('X',111,'BILLY',100,250,900,'2014-5-23','1'),
('Y',111,'BILLY',100,350,100,'2014-5-23','2'),
('Z',222,'DAN' ,200,200,200,'2014-5-23','3'),
('Z',222,'DAN' ,200,200,200,'2014-5-23','4')
SELECT 'X' JOBSITE,
UID,NAME,
RATE,
SUM(AMOUNT) AMOUNT,
SUM(AMOUNT2) AMOUNT2,
DATEPROCESSED,
'X' FORIGIN
FROM @A
WHERE DATEPROCESSED = '2014-5-23'
GROUP BY UID,
NAME,
RATE,
DATEPROCESSED
请原谅我,如果我读错了这个问题。