我有一个名为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
并且还要注意如何根据位置扩展列字段的增加。 提前谢谢。
答案 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) |