2013-05-02 67 views
0

我有2个表,我需要连接并生成第三个表,列水平排列。表格如下: enter image description here查询水平排列行

我需要table1table2的输出2。

我做了一些研究,发现我需要使用PIVOT。我也写了一些查询。我的查询是

SELECT * FROM (
    SELECT 
    CONVERT(CHAR(4), table_2.Date, 100) + CONVERT(CHAR(4), table_2.Date, 120) as RegistrationDate, 
    table_1.PDESC as ProductDescription from table_2 
    left outer join table_1 on table_1.PID = table_2.PID 
) 
tableT 
PIVOT (count(ProductDescription) FOR RegistrationDate 
IN ([Jan 2009],[Feb 2009],[Mar 2009],[Apr 2009],[May 2009],[Jun 2009])) AS pvt 

但是这个查询不起作用!我还附加了SQL脚本来创建表。

我已将该脚本上传到here

+4

安置自己的脚本,而不是到sqlfiddle.com是NSFW网站 – RichardTheKiwi 2013-05-02 11:05:49

+4

你不应该给一个*在[so]问题下载*链接,特别是不要到文件共享网站。代码应该最好包含在问题本身中,如果它太长了,你应该尝试构建一个简短的例子,如果这是不可能的,应该链接到一个网站(最好是具有良好声誉的知名度),代码出现并且不需要被下载。如果您提供的下载链接的代码与问题中的代码相同,则应删除该链接。 – Dukeling 2013-05-02 11:19:57

+0

由于您正在从'table_2'中选择并加入到'table_1'中,并且假设'table_2.PID'是'table_1.PID'的外键,您应该将您的连接更改为'INNER'连接,因为不存在任何记录在'table_1'中不存在的'table_2'中。或者,如果您希望产品即使在“table_2”中没有记录,也要在结果中显示,请更改,以便您从table_1中选择并保留加入“table_2”。 – GarethD 2013-05-02 12:00:30

回答

2

问题是,您正试图同时count和显示ProductDescription。如果你想显示ProductDescription,那么有几种不同的方法可以做到这一点。

代替将countProductDescription,可以countPID柱:

SELECT * 
FROM 
(
    SELECT CONVERT(CHAR(4), t2.Date, 100) + CONVERT(CHAR(4), t2.Date, 120) as RegistrationDate, 
    t1.ProductDesc as ProductDescription, 
    t1.PID 
    from table_2 t2 
    left outer join table_1 t1 
    on t1.PID = t2.PID 
) tableT 
PIVOT 
(
    count(PID) FOR RegistrationDate 
    IN ([Jan 2009],[Feb 2009],[Mar 2009],[Apr 2009],[May 2009],[Jun 2009]) 
) AS pvt; 

SQL Fiddle with Demo

或者您可以在子查询中创建第二列来返回ProductDescription两次。一列将在计数使用,第二个将在最终显示器中使用:

SELECT * 
FROM 
(
    SELECT CONVERT(CHAR(4), t2.Date, 100) + CONVERT(CHAR(4), t2.Date, 120) as RegistrationDate, 
    t1.ProductDesc as ProductDescription, 
    t1.ProductDesc as Product 
    from table_2 t2 
    left outer join table_1 t1 
    on t1.PID = t2.PID 
) tableT 
PIVOT 
(
    count(ProductDescription) FOR RegistrationDate 
    IN ([Jan 2009],[Feb 2009],[Mar 2009],[Apr 2009],[May 2009],[Jun 2009]) 
) AS pvt; 

SQL Fiddle with Demo