许多一对多成一排

时间:2018-04-30 15:53:26

标签: sql sql-server one-to-many

我在SQL Server 2008 R2中有一个看起来像下面的“表”的视图。

我想要一个'交叉表'视图或存储过程来获得如下所述的结果。该视图包含三个表Main --- to many Props --- to many lineitems

Mainname | Prop | lineitems
---------+------+------------
Smith    | P1   | cheese  
Smith    | P1   | tires  
Smith    | P1   | baseballs  
Smith    | P2   | gel  
Smith    | P3   | windows  
Smith    | P3   | guitar  
Jones    | T4   | shoes  
Lane     | Q1   | cushion  
Lane     | Q2   | dirt

我需要让它看起来像这样:

Mainname | Prop1 | lineitems1 | lineitems2 | lineitems3 | Prop2 | lineitems1 | Prop3 | lineitems1 | lineitems2
---------+-------+------------+------------+------------+-------+------------+-------+------------+-----------
Smith    | P1    | cheese     | tires      | baseballs  | P2    | gel        | P3    | windows    | guitar  
Jones    | T4    | shoes  
Lane     | P5    | cushion    | <null>     | <null>     | P6    | dirt  

Image example of above

2 个答案:

答案 0 :(得分:0)

这里真正的问题是桌面设计。您有一列代表许多不同的东西。在关系数据库中,这只是个坏主意。

解决问题的方法之一称为“CROSS PIVOTING”。在缺少可消耗数据的情况下,这是伪SQL,并且根据我的评论有所涉及的假设:

WITH RNs AS(
    SELECT *,
           DENSE_RANK() OVER (PARTITION BY [Name] ORDER BY Prop) AS PropRN
           ROW_NUMBER() OVER (PARTITION BY [Name], Prop ORDER BY Item) AS ItemRN
    FROM YourTable)
SELECT [Name],
       MAX(CASE WHEN PropRN = 1 THEN Prop END) AS Prop1,
       MAX(CASE WHEN PropRN = 1 AND ItemRN = 1 THEN Item END) AS Prop1Item1,
       MAX(CASE WHEN PropRN = 1 AND ItemRN = 2 THEN Item END) AS Prop1Item2,
       MAX(CASE WHEN PropRN = 1 AND ItemRN = 3 THEN Item END) AS Prop1Item3,
       MAX(CASE WHEN PropRN = 2 THEN Prop END) AS Prop2,
       MAX(CASE WHEN PropRN = 2 AND ItemRN = 1 THEN Item END) AS Prop2Item1,
       ...
FROM RNs
GROUP BY [Name];

答案 1 :(得分:0)

虽然Larnu的回答可能有效(我没试过)。对我有用的解决方案就是这个。我在表格中添加了另一栏......费用

      hour   magnitude tornadoCount hourlyTornadoCount Percentage Tornadoes
 1: 01 AM         0            5                 18          0.277777778
 2: 01 AM         1            9                 18          0.500000000
 3: 01 AM         2            2                 18          0.111111111
 4: 01 AM         3            2                 18          0.111111111
 5: 01 PM         0           76                150          0.506666667
 6: 01 PM         1           45                150          0.300000000
 7: 01 PM         2           21                150          0.140000000
 8: 01 PM         3            5                150          0.033333333
 9: 01 PM         4            3                150          0.020000000
10: 02 AM         0            4                 22          0.181818182
11: 02 AM         1            6                 22          0.272727273
12: 02 AM         2           11                 22          0.500000000
13: 02 AM         4            1                 22          0.045454545
14: 02 PM         0           98                173          0.566473988
15: 02 PM         1           36                173          0.208092486
16: 02 PM         2           25                173          0.144508671
17: 02 PM         3           11                173          0.063583815
18: 02 PM         4            2                173          0.011560694
19: 02 PM         5            1                173          0.005780347
20: 03 AM         1            6                  9          0.666666667
21: 03 AM         2            2                  9          0.222222222
22: 03 AM         3            1                  9          0.111111111
23: 03 PM         0          116                257          0.451361868
24: 03 PM         1           84                257          0.326848249
25: 03 PM         2           39                257          0.151750973
26: 03 PM         3           12                257          0.046692607
27: 03 PM         4            6                257          0.023346304
28: 04 AM         0            4                 16          0.250000000
29: 04 AM         1            5                 16          0.312500000
30: 04 AM         2            5                 16          0.312500000