【问题标题】:SQL Query in an 1:N relationship1:N 关系中的 SQL 查询
【发布时间】:2018-08-03 10:00:15
【问题描述】:

我有以下数据库,这是一个用户和他的收据之间的简单关系:

我需要获得与用户一样多的行和尽可能多的收据列。例如:

如果用户 1 有 2 个收据,我必须获得:

IdUser   Receipt 1    Receipt 2
  1         12€          13€

我尝试在 User 和 Receipt 表之间建立一个内部连接,但我的用户行数与他们的收据数一样多。

编辑

SELECT user.idUser, receipt.value
FROM user INNER JOIN receipt ON user.IdUser = receipt.IdUser;

【问题讨论】:

  • 您必须在查询中使用Dynamic PIVOT
  • 附上您尝试过的查询?
  • 就个人而言,我建议不要使用动态 SQL,而是在表示层中进行这种类型的转换。例如,通过使用 SSRS 中的矩阵或 Excel 中的数据透视表。
  • @venkatesh 好的,我添加了我尝试过的查询。
  • 您会在查询中返回超过 1 个用户吗?如果您必须使用 T-SQL 而不是表示层来执行此操作,那么 Consumable 示例数据将真正帮助您获得答案。

标签: sql sql-server ms-access sql-server-2000


【解决方案1】:

如果您知道收据的最大数量,您可以通过以下数据透视查询获得结果:

SELECT * FROM (
SELECT   ROW_NUMBER() OVER(PARTITION BY receipt.IdUser  ORDER BY receipt.IdUser ASC) AS RowId, user.IdUser, receipt.value
  FROM user  INNER JOIN receipt ON user.IdUser = receipt.IdUser 
  )
 as s
PIVOT
(
    max(value)
    FOR RowId IN ([1], [2], <max number of the receipts> )
)AS pvt

但如果您不知道最大项目数,最好使用动态枢轴

SQL Server - Dynamic PIVOT Table - SQL Injection

【讨论】:

  • 感谢您的回答,但我有 sql server 2000 和 ROW_NUMBER() OVER(PARTITION BY) 它没有实现,抱歉我没有指定版本。在其他版本中工作正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多