2013-08-29 53 views
0

我有一张表,其中包含一个vendor,categorypage。我需要根据这个表创建一个索引(就像你在一个目录中一样)。页号索引

我可以通过行和如果供应商和类别是一样的上面行,新页面被添加到细胞的上方结束循环在Excel中做到这一点:

Tim's Company  Code  120 
Tim's Company  Code  122 

会导致

Tim's Company  Code  120,122 

Excel是很好,当我处理下一个1000行。我在这里的12K区域。这将需要永远。另外,我结束了一些我不想要的页面重复实例。在SQL我可以摆脱重复的前面,我不知道如何做页面上的连接。在SSRS这样做会更好吗?或者视图是否会生成结果?

回答

0

试试这个:Fiddle demo

SELECT t1.Vendor,t1.Category, 
     csvPages = REPLACE((SELECT CONVERT(VARCHAR(12),Page) AS [data()] 
          FROM mytable t2 
          WHERE t2.Vendor = t1.Vendor AND 
            t2.Category = t1.Category 
          ORDER BY t2.Vendor 
          FOR XML PATH('') 
          ), ' ', ',') 
FROM mytable t1 
GROUP BY t1.Vendor,t1.Category ; 
+0

我只有一张表t1什么是t2? –

+0

我也只使用一个名为mytable的表。 t1,t2是同一个表的“表别名”。只需用你的表名替换mytable。 MSDN链接表的别名:http://technet.microsoft.com/en-us/library/ms187455(v=sql.105).aspx – Kaf

1
DECLARE @x TABLE(vendor VARCHAR(32), category VARCHAR(32), page INT); 

INSERT @x VALUES 
('Tim''s Company','Code',120), 
('Tim''s Company','Code',122); 

SELECT vendor, category, pages = STUFF((
    SELECT ',' + CONVERT(VARCHAR(12), page) 
    FROM @x AS x2 
    WHERE x2.vendor = x.vendor AND x2.category = x.category 
    ORDER BY page 
    FOR XML PATH(''), TYPE).value('.[1]','nvarchar(max)'),1,1,'') 
FROM @x AS x 
GROUP BY vendor, category; 
+0

我没有得到第二个表。我是否必须复制表格才能使其工作? –

+0

是的,它本质上是一个自联接,但使用相关的子查询。如果由于大量数据而导致性能不佳,请考虑在别处执行此操作(如在C#中)。 –

0

您可以创建一个连接所有值标值的函数:

CREATE FUNCTION [dbo].[getPages] 
(
    @Vendor varchar(100), 
    @Category varchar(50) 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
    DECLARE @Pages VARCHAR(8000) 
    SELECT @Pages = COALESCE(@Pages + ',','') + CAST(TN.Page AS VARCHAR) 
    FROM dbo.TableName TN 
    WHERE [email protected] AND [email protected] 
    ORDER BY TN.Page 
    RETURN @Pages 
END 

现在你可以这样使用它:

SELECT Vendor, Category, 
     Pages=dbo.getPages(Vendor,Category) 
FROM dbo.TableName 
GROUP BY Vendor, Category 

DEMO

VENDOR   CATEGORY  PAGES 
Tims Company Code   120,122