如何加入/展平这些表格

时间:2011-02-24 00:41:55

标签: sql-server tsql

我有一张这样的表:

表名:PRODUCT

ID     PRODUCTID     PRODUCTNAME
1      D100          Sample Product
2      K500          Another sample product

有一个相关的表格如下:

表名:COLORSIZE

ID     PRODUCTID     COLOR          S       M      L     XL
1      D100          Red            S       M      L 
2      D100          Black          S       M      L
3      D100          Blue           S       M      L
4      K500          Green                         L     XL
4      K500          Red                           L     XL

一般规则是产品ID总是具有相同的尺寸,只是不同的颜色。因此,如果D100红色有S,M和L,则所有D100只有S,M和L.产品最多可以有20种颜色。

我需要编写一个输出以下

的sql语句

PRODUCTSWITHCOLORS

ID     PRODUCT ID     PRODUCTNAME     COLOR1     COLOR2     COLOR3   S    M    L   XL
1      D100           Sample product  Red        Black      Blue     S    M    L
2      K500           Another sample  Green      Red                           L   XL

“COLOR1”,“COLOR2”列需要转到“COLOR20”max或者它们需要以最大颜色数结束(即,如果在查询中,产品的最大颜色数为4 ,停在COLOR4处可以。)

这不是一种理想的方式,但它是已经请求的报告。任何人都可以帮我写一个能完成此任务的SQL语句吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

如果您使用的是2005/2008版本的sql server,则可以使用PIVOT。 为了停止最大颜色数,您可以动态构建此查询。 这是一些帮助:

;WITH ProductColor as(
select  a.ProductId,
        b.ProductName,
        a.Color,
        RANK() over (partition by ProductName order by a.Id) r
from    dbo.COLORSIZE a left join
        dbo.PRODUCT b on a.PRODUCTID=b.PRODUCTID
)
SELECT ProductId,ProductName,[1], [2], [3]
FROM 
(select ProductId,ProductName,Color,r
from    ProductColor) p
PIVOT
(
MIN (Color)
FOR r IN
( [1], [2], [3] )
) AS pvt;

答案 1 :(得分:0)

这将让你开始..

你需要做SubQuerys,但问题是你试图根据你拥有的颜色数量来制作一张桌子。

您的架构无法正常运行。

SELECT 
   A.ID
  ,B.PRODUCTID
  ,B.PRODUCTNAME
  ,B.COLOR1
  ,B.COLOR2
  ,B.COLOR3
  ,B.S
  ,B.M
  ,B.L
FROM 
     PRODUCT A
     INNER JOIN 
        COLORSIZE B 
               ON A.ProductID = B.ProductID