Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询1:N个引用_Sql_Sql Server 2008 - Fatal编程技术网

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中透视它。谢谢你的支持!