2016-09-16 105 views
2

举例来说,我有一张表,其中包含客户在咖啡馆中活动的描述。 (比喻实际的表的我的工作)将多行组合成一行

Customer Borrowed Book Ordered Drink Has Company 
1    1  
1        1 
1            Yes 
2        1 
3        1 
3            Yes 
4    1    1 
4        1 

我想行这样

Customer Borrowed Book Ordered Drink Has Company 
1    1     1   Yes 
2         1 
3         1   Yes 
4    1     2 

我做自联接与聚结结合,但它并没有给我想要的结果。

+0

想必你只是想'总和([借来的书]),SUM([下令饮料]),MAX([有公司])'和组按客户? – ZLK

+0

@ZLK,是的,有点..但初始表实际上是一个结果集的临时表,我不能通过聚合问题 –

+0

哼。如果不知道原始数据是什么以及为什么会遇到聚合问题,很难提供帮助。注意:当执行总和时,您可能还需要一个'isnull(x,0)'语句。 – ZLK

回答

0

根据您的评论,初始表是一个临时表, 尽量使结果作为CTE结果,然后再做聚集上,像下面的查询。

; WITH cte_1 
     AS 
    ( //your query to return the result set) 
    SELECT customer,sum([borrowed book]) BorrowedBook, 
     sum([ordered drink]) OrderedDrink, 
     max([has company]) HasCompany 
    FROM cte_1 
    GROUP BY Customer 
1

您可以通过组做到这一点,

select Customer,sum([borrowed book]), sum([ordered drink]), max([has company]) 
from customeractivity group by Customer 
0

使用组方:

DECLARE @tblTest as Table(
    Customer INT, 
    BorrowedBook INT, 
    OrderedDrink INT, 
    HasCompany BIt 
) 

INSERT INTO @tblTest VALUES 
(1,1,NULL,NULL) 
,(1,NULL,1,NULL) 
,(1,NULL,NULL,1) 
,(2,NULL,1,NULL) 
,(3,NULL,1,NULL) 
,(3,NULL,NULL,1) 
,(4,1,1,NULL) 
,(4,NULL,1,NULL) 

SELECT 
    Customer, 
    SUM(ISNULL(BorrowedBook,0)) AS BorrowedBook, 
    SUM(ISNULL(OrderedDrink,0)) AS OrderedDrink, 
    CASE MIN(CAST(HasCompany AS INT)) WHEN 1 THEN 'YES' ELSE '' END AS HasCompany 
FROM @tblTest 
GROUP BY Customer 
0

不知道,为什么你被越来越误差组。

你的合并应该是正确的。请参阅下面的方式

Select customer 
, case when [borrowed] = 0 then NULL else [borrowed] end as [borrowed] 
, case when [ordered] = 0 then NULL else [ordered] end as [ordered] 
, case when [company] = 1 then 'Yes' end as company 
from 
(
    Select customer, 
    coalesce(
    case when (case when borrowed = '' then null else borrowed end) = 1 then 'borrowed' end, 
    case when (case when ordered = '' then null else ordered end) = 1 then 'ordered' end, 
    case when (case when company = '' then null else company end) = 'Yes' then 'company' end 
    ) val 
    from Table 
) main 
PIVOT 
(
    COUNT (val) 
    FOR val IN ([borrowed], [ordered], [company]) 
) piv 

OUTPUT:

customer | borrowed | ordered | company 
--------------------------------------- 
1   1   1   Yes 
2   NULL  1   NULL 
3   NULL  1   Yes