2012-02-01 80 views
2

我有这样的选择如下:SQL查询的分组

SELECT SUBSTRING(Col1, 1, 3)   AS 'Series', 
     b.Col2, 
     CAST(c.Price * c.Qty AS MONEY) AS Total 
FROM tableName a 
inner join .... 
... 
WHERE DATE BETWEEN '1/1/2012' AND '1/31/2012' 
     AND B IN ('C50', 'C51', 'C52', 'C53', 'C54') 
GROUP BY Col1, 
      b.Col2, 
      c.Price, 
      c.Qty 

它返回这个结果集:

Series  Col2  Total 
---------- ---------- ---------- 
105   C50   5.00 
105   C50   15.00 
105   C53   20.00 
105   C53   20.00 
105   C53   20.00 

这是我想它是如何工作的:

Series  C50   C53 
---------- ---------- ---------- 
105   20.00  60.00 

不知道如何做内部选择以获得该结果。有任何想法吗?

+1

您需要旋转。 – 2012-02-01 22:47:45

+0

看看这个链接,它可能会有所帮助。 http://technet.microsoft.com/en-us/library/ms177410.aspx – Dan 2012-02-01 22:55:23

回答

1

请试试以下代码。你必须使用PIVOT查询。

create table TableName (Series varchar(20),col2 varchar(10), price decimal(8,2)) 

insert into TableName values ('105','C50',30) 
insert into TableName values ('105','C50',10) 

insert into TableName values ('105','C53',20) 
insert into TableName values ('105','C53',30) 


SELECT Series, 
     [C50], 
     [C53] 
FROM (SELECT Series, 
       col2, 
       price 
     FROM TableName) AS SourceTable 
        PIVOT (SUM(price) FOR col2 IN ([C50], 
                [C53]) 
     ) AS PivotTable; 
+0

@马丁史密斯 - 非常好,谢谢!我将如何获得任何潜在空值的列? IE浏览器。 Col2具有空值,但它们具有与它们相关联的总计。 – hype 2012-02-02 16:18:02

+0

我提供了你问的问题[col2的潜在空值] – 2012-02-03 09:35:22

0

对于col2的潜在空值,请尝试下面的代码。

注意:您可能需要调整@PIV_COL大小,具体取决于col2的不同记录数。我使用'NO_VAL'作为col2的潜在NULL值。

insert into TableName values ('105',NULL,100) 


DECLARE @PIV_COL VARCHAR(100) 

SELECT @PIV_COL = STUFF(
(
    SELECT DISTINCT ',[' + ISNULL(COL2,'NO_VAL') + ']' 
    FROM TableName C 
    FOR XML PATH('') 
), 1, 1, '') 


EXEC 
(' 
    SELECT Series,' + @PIV_COL + ' 
    FROM (
       SELECT Series, 
        ISNULL(COL2,''NO_VAL'') col2, 
        price 
      FROM TableName) AS SourceTable 
         PIVOT (SUM(price) FOR col2 IN ('+ @PIV_COL + ') 
    ) AS PivotTable 
')