总结MS SQL Server查询

时间:2014-05-23 03:22:25

标签: sql-server

我有以下记录

       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()。

3 个答案:

答案 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;

不应该生成四列不同的行:UIDNameRateDateProcessed

您只是明确选择了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

enter image description here

请原谅我,如果我读错了这个问题。