SQL查询1:N个引用
我在看什么SQL查询1:N个引用,sql,sql-server-2008,Sql,Sql Server 2008,我在看什么 License_Plate | Frame | Car_Info's | Holder_Name AA001AA VF7UA9HR8CJ615652 Car Things Mario Rossi AA001AA VF7UA9HR8CJ615652 Same Car Things Luigi Verdi 我想知道是否可以创建一个SELECT,在一行中显示两个表中的
License_Plate | Frame | Car_Info's | Holder_Name
AA001AA VF7UA9HR8CJ615652 Car Things Mario Rossi
AA001AA VF7UA9HR8CJ615652 Same Car Things Luigi Verdi
我想知道是否可以创建一个SELECT,在一行中显示两个表中的以下信息:
伪代码:
我的桌子
CAR(License_Plate_PK, Frame, Car_Info)
Holder_Data(License_Plate_FK, Holder_Data)
我的结果
License_Plate | Frame | Car_Info's | Holder_Name
AA001AA VF7UA9HR8CJ615652 Car Things Mario Rossi
AA001AA VF7UA9HR8CJ615652 Same Car Things Luigi Verdi
我想要实现的目标
License_Plate | Frame | Car_Info's | Holder_Name1 | Holder Name2
AA001 VF7UA9HR8CJ615652 Car Things Mario Rossi Luigi Verdi
(我写汽车信息只是因为我有30个关于汽车信息的专栏。这只是为了简化,你可以很容易地忽略这个专栏)
我知道如果有两个或更多的持有者,我的查询将返回两行或更多行。是否有方法返回同一行中的所有持有人
我使用的是MS SQL Management Studio 2008,SQL不允许不确定或动态更改列数。这意味着您需要提前决定要有多少列
holder
例如,以下代码将透视您的holder\u数据
表(然后您可以将其连接到汽车
表)。它假设最多有三个持有者
SELECT
license_plate,
MAX(CASE WHEN row_id = 1 THEN name END) AS holder_1_name,
MAX(CASE WHEN row_id = 1 THEN address END) AS holder_1_address,
MAX(CASE WHEN row_id = 2 THEN name END) AS holder_2_name,
MAX(CASE WHEN row_id = 2 THEN address END) AS holder_2_address,
MAX(CASE WHEN row_id = 3 THEN name END) AS holder_3_name,
MAX(CASE WHEN row_id = 3 THEN address END) AS holder_3_address
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY license_plate ORDER BY some_date_field) AS row_id
FROM
holder_data
)
AS sorted_holder_data
如果您希望根据持有者的数量动态更改,则需要分几个步骤进行操作。1.运行查询以查找最大持有者数量
2.运行一些编写SQL的代码,多次重复
MAX(CASE)
部分3.使用
sp\u executesql
这是一个很大的努力,对吗?必须有更好的方法以本机方式支持SQL吗
你说得对。SQL的设计初衷是通过使用规范化数据来实现其关系性质。也就是说,从编程的角度考虑数据的结构,而不是从人性化的表示角度
方便的是,您的数据已经处于标准化结构中。因此,如果您希望使用真正的SQL方式做事,请不要以数据为轴心
但是,演示呢
这不是SQL的用途。SQL是一种数据存储和处理语言。它不是为演示而设计的,也不是为演示而设计的。您应该将设计的表示层与数据层分开。混合使用这两种方法会导致后续的各种维护问题。这是一种错误的经济,因为你越是试图坚持这种非标准化的思维方式,你使用SQL的难度就越大。不要这样做,保持SQL数据结构正常化,这就是SQL的用途
相反,这种数据透视应该在表示层中完成。无论是Excel、SSRS、QlikView、Tableau还是其他什么。他们也知道标准化数据,并积极准备将标准化数据转换为人类可展示的格式
编辑:
我刚读到你在评论中写道:
我不太擅长excel管理,所以我想知道是否有办法在导出之后,而不是在导出期间或之前,通过编辑xlsx工作表来完成
你的问题就在那里。因为您对Excel没有信心,所以希望使用SQL为您完成这项工作。不幸的是,SQL是错误的位置,Excel是正确的位置。您需要学习如何在Excel中执行此操作
查看Pivot表、Power Pivot、VBA(Visual Basic for Applications)等。Excel有多种方法可以满足您的需要,我强烈建议您学习如何使用正确的工具来完成此项工作,而不是强行使用错误的工具来为您做不好的工作。请标记您的DBMS(包括版本)已完成,我使用的是ms SQL management studio 2008,将它们放在一行的目标是什么?您想让它们的计数,还是用逗号分隔?编辑您的问题并提供示例数据和所需结果。不清楚您想要实现什么。您正在进行数据透视,这在Excel中非常容易(但超出了本问题的范围),而在旧版本的SQL Server中则相当困难。我会按您的方式导出它,然后在Excel中进行透视,因为您已经计划在其中存储数据,最后我可以在Excel中透视它。谢谢你的支持!