将两个表组合在一起,基于行作为列字段sql

时间:2014-08-23 01:39:39

标签: sql sql-server join

我有一个名为customer和Location的两个表,例如

Table Customer          Table Location

Name    PartNo          Location    PartNo  maxvalue    minvalue

---------------        ---------------------------------------------

Name1   123             Location1   123     10          2
Name2   1234            Location2   1232    24          10
Name3   1232            Location2   123     14          2
                        Location1   1234    30          2

我需要一个查询显示如下

PartNo      Location    maxvalue    minvalue    Location    maxvalue    minvalue    
----------------------------------------------------------------------------------
123         Location1   10          2           Location2   14          2       
1234        Location1   30          4           Location2
1232        Location1                           Location2   24          10

并且还要注意如何根据位置扩展列字段的增加。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

根据您的评论,每个部分最多只能有2个位置,最多可以让您走上正确的轨道。

如果存在名为“location_count”的字段或具有该性质的字段,指示“第一”与“第二”的位置,则可以使用条件聚合。类似于你现在在LOCATION字段中有“location1”和“location2”的方式,但是我认为那些是位置名称? (而不是与该部件相关的第一个与第二个位置的指示器。)

如果有这样的字段,你可以避免这两个连接并使用条件聚合。

在任何情况下,只给出您的样本数据,您可以运行以下内容:

小提琴: http://sqlfiddle.com/#!6/6c8da/12/0

select x.partno,
       x.loc1,
       y.maxvalue as loc1_maxval,
       y.minvalue as loc1_minval,
       x.loc2,
       z.maxvalue as loc2_maxval,
       z.minvalue as loc2_minval
  from (select partno,
               min(location) as loc1,
               case
                 when max(location) <> min(location) then
                  max(location)
               end as loc2
          from location
         group by partno) x
  left join location y
    on x.partno = y.partno
   and x.loc1 = y.location
  left join location z
    on x.partno = z.partno
   and x.loc2 = z.location

<强>输出:

| PARTNO |      LOC1 | LOC1_MAXVAL | LOC1_MINVAL |      LOC2 | LOC2_MAXVAL | LOC2_MINVAL |
|--------|-----------|-------------|-------------|-----------|-------------|-------------|
|    123 | Location1 |          10 |           2 | Location2 |          14 |           2 |
|   1232 | Location2 |          24 |           2 |    (null) |      (null) |      (null) |
|   1234 | Location1 |          30 |           2 |    (null) |      (null) |      (null) |

请注意,部件1232和1234只有一个位置,因此它们显示在loc1列中。这是因为它们是与该部件相关的第一个也是唯一一个位置。我不明白你是如何从你的样本数据中获得一个位置而另一个位于另一侧的位置。虽然其中一个名称为“location1”而另一个名称为“location2”,但这些值似乎是位置的名称,而不是订单的指示符。

以下编辑假设“LOCATION”中的值始终为“Location1”或“Location”2

小提琴: http://sqlfiddle.com/#!6/88f19c/1/0 这符合您的预期结果,但部分1234的最小值location1为2(不是4);这与您的实际数据一致。

select   partno,
         'Location1' as location1,
         max(case location when 'Location1' then maxvalue end) as l1_max,
         max(case location when 'Location1' then minvalue end) as l1_min,
         'Location2' as location2,
         max(case location when 'Location2' then maxvalue end) as l2_max,
         max(case location when 'Location2' then minvalue end) as l2_min
from     location
group by partno

<强>输出:

| PARTNO | LOCATION1 | L1_MAX | L1_MIN | LOCATION2 | L2_MAX | L2_MIN |
|--------|-----------|--------|--------|-----------|--------|--------|
|    123 | Location1 |     10 |      2 | Location2 |     14 |      2 |
|   1232 | Location1 | (null) | (null) | Location2 |     24 |     10 |
|   1234 | Location1 |     30 |      2 | Location2 | (null) | (null) |