我有一个关于sql
(MS SQL 2016)和pivot
功能的问题。首先让我解释一下数据结构。
的例子tbl_Preise
。有几种价格(Preis
)为每个区域(Gebiet_von
,Gebiet_bis
)在继电器(StaffelNr
)。全部连接到同一货运(Fracht_id
)。每种货物可以有不同数量的继电器。所有这些继电器重复每个区域,因此即有一个价格为继电器1
的面积1800 - 1899
,但还有另一种价格为继电器1
的区域1900 - 1999
。
该表的tbl_Preise
外观如下:
autoID Fracht_id Gebiet_von Gebiet_bis Zielland_Nr StaffelNr Preis Mindestpreis Mautkosten
16933 4 1800 1899 4 1 22,6481 0,00 0,00
16934 4 1800 1899 4 2 37,0843 0,00 0,00
16935 4 1800 1899 4 3 54,9713 0,00 0,00
16936 4 1900 1999 4 1 23,4062 0,00 0,00
16937 4 1900 1999 4 2 84,4444 0,00 0,00
现在,我有另一个表tbl_Fracht_Staffeln
,其中保存了继电器的数量。
该表如下所示:
id fracht_id staffelNr menge
18 4 1 50
19 4 2 100
20 4 3 150
21 4 4 200
现在,我想合并这些数据,这些数据可能会因每种货物的中继数量不同而有所不同。我已经通过以下查询完成了此操作:
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(staffelNr)
from tbl_Preise (nolock)
where fracht_id = @freightId
group by staffelNr
order by StaffelNr
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'
SELECT
Bezeichnung,
fracht_id,
gebiet_von,
gebiet_bis,
' + @cols + N'
from
(
select
l.Bezeichnung as Bezeichnung,
Zielland_Nr,
tbl_Preise.fracht_id,
gebiet_von,
gebiet_bis,
preis,
tbl_Preise.staffelNr as staffelNr
from
tbl_Preise (nolock)
left join
[dbo].[vw_Laender] l on tbl_Preise.Zielland_Nr = l.[Nummer]
where
tbl_Preise.Fracht_id = ' + cast(@freightId as nvarchar(100)) + '
) x
pivot
(
max(preis)
for staffelNr in (' + @cols + N')
) p
order by
gebiet_von, gebiet_bis'
exec sp_executesql @query;
这个查询给我这个结果:
Bezeichnung fracht_id gebiet_von gebiet_bis 1 2 3 4 5 6
Germany 4 01800 01899 NULL NULL NULL NULL NULL NULL
Germany 4 06400 06499 NULL NULL NULL NULL NULL NULL
Germany 4 1800 1899 22,6481 37,0843 54,9713 64,4062 84,4444 94,6546
Germany 4 20500 20599 17,9088 27,3983 40,8845 46,7485 61,4905 67,835
Germany 4 21200 21299 17,9088 27,3983 40,8845 46,7485 61,4905 67,835
Germany 4 21500 21599 17,9088 27,3983 40,8845 46,7485 61,4905 67,835
不要完全看价格和区号。tbl_Preise
为了使关系和意义更加清晰,我在示例中进行了一些更改。到目前为止,一切都很好。但是现在,如您所见,我的表中有staffelNr
(1,2,3,4,…)作为标题。
我需要那里的
menge
表列tbl_Fracht_Staffeln
。
我已经尝试了joins
其他一些东西,但是都没有用,因为我找不到将column names
(1,2,3,4
…)连接到表的方法tbl_Fracht_Staffeln
。有什么办法可以做到这一点?预先非常感谢您的帮助!
为此,您需要使用列标题2次-
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX) , @freightId as int , @cols1 AS NVARCHAR(MAX)
select @freightId = 4
select @cols = STUFF((SELECT ',' + QUOTENAME(t1.staffelNr) + ' as ' + QUOTENAME(t2.menge )
from tbl_Preise t1 (nolock)
join tbl_Fracht_Staffeln t2(nolock)
on t1.fracht_id = t2.fracht_id and t1.staffelNr = t2.staffelNr
where t1.fracht_id = @freightId
group by t1.staffelNr , t2.menge
order by t1.StaffelNr
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols1 = STUFF((SELECT ',' + QUOTENAME(staffelNr)
from tbl_Preise (nolock)
where fracht_id = @freightId
group by staffelNr
order by StaffelNr
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'
SELECT
fracht_id,
gebiet_von,
gebiet_bis,
' + @cols + N'
from
(
select
Zielland_Nr,
tbl_Preise.fracht_id,
gebiet_von,
gebiet_bis,
preis,
tbl_Preise.staffelNr as staffelNr
from
tbl_Preise (nolock)
where
tbl_Preise.Fracht_id = ' + cast(@freightId as nvarchar(100)) + '
) x
pivot
(
max(preis)
for staffelNr in (' + @cols1 + N')
) p
order by
gebiet_von, gebiet_bis'
print @query
exec sp_executesql @query;
问题内容: 我有一张这样的产品零件表: 部分 我想要一个查询,将返回这样的表: 在其实际实施中,将有数百万个产品零件 问题答案: 不幸的是,MySQL没有函数,但是您可以使用聚合函数和语句对其进行建模。对于动态版本,您将需要使用准备好的语句: 请参见带有演示的SQL Fiddle 如果只有几列,则可以使用静态版本:
我在使用PIVOT SQL脚本时遇到了一个“小”问题。我目前的解决方案基于类似的问题 动态枢轴 . 我已经写好了PIVOT脚本,基本上没问题。然而,我的情况是这样的,脚本输出类似这样的内容,而不是将唯一的条目放在单行上 而我所寻找的结果应该是这样的 这是脚本 我将不胜感激一些可以帮助我解决这个问题的指示。我在这里做了一个小提琴,由于某种奇怪的原因,它没有输出任何东西,但生成架构的所有代码都在那里
问题内容: 好吧,我有一张看起来像这样的表 现在,我需要将其转换为: 我一直在看动态透视图示例,但是我似乎无法使其适合我的情况。 有人可以帮忙吗? 问题答案: 看下面的例子
问题内容: 示例选择: 输出: 是否可以按时间顺序对记录进行排序,排除列“月”和“年”?没有列出所有列。 UPD 需要: 就像是: 问题答案: 要对记录进行排序,可以将以下内容添加到sql的末尾 注意:枢轴列名称区分大小写,因此需要用引号引起来 这是完整的查询,仅选择您需要的列:
我正在尝试转换以下JSON 用JOLT转换成更简单的东西: 我尝试了很多颠簸的代码,但我不知道如何完成最后一部分。我写了一些颠簸的转变: 但是我不知道如何做最后一部分来旋转name列。name列的值应该基于NAV值旋转。