【问题标题】:Combining SQL rows where column X values are equal but column Y values are different (need to be overriden)组合 X 列值相等但 Y 列值不同的 SQL 行(需要覆盖)
【发布时间】:2018-09-03 00:10:29
【问题描述】:

在这里完成 SQL 新手。我有一个任务,我应该创建一大堆表,然后在它们之间执行某些过滤。 从图片中可以看出,这些实际上是 2 个不同的标题(来自一个更大的表,其中包含更多这些标题),但它们中的每一个都作为书籍、音频和视频副本,因此每个不同的标题有 3 行。

有什么方法可以让我根据标题扫描多行,然后为每个标题返回一行,说明它是否可用作视频和音频?因此,只要在任何 3 行中,“available_in_audio”或“available_in_video”中的答案是肯定的,“是”将覆盖之前或之后扫描的任何列的“否”。

例如,对于 3 行《哈利波特与密室》,我只想要一个“Available_in_Audio”为“是”且““Available_in_Video”为“是”的行。

If both available_as_video and available_as_audio are "No", means it's a book, if available_as_audio is "Yes" means it's an audio copy and available_as_video means it's a video copy

非常感谢您提出这么长的问题!

【问题讨论】:

  • 你应该规范化你的模式,把这个表分成两个。
  • 我支持您对规范化@eggyal 的评论,但说将此表分成两个是我不支持的规范化。因为对 topicstarters 数据的规范化可能需要两个以上的表。
  • 这是公平的评论,@RaymondNijland。
  • GROUP BYMAX 用于音频和视频列

标签: mysql sql filtering


【解决方案1】:

试试这个

SELECT Title, 
    CASE WHEN (MAX(CASE WHEN Available_in_Audio = 'Yes' THEN 1 ELSE 0 END)) = 1 THEN 'Yes' ELSE 'No' END) AS Available_in_Audio,
    CASE WHEN (MAX(CASE WHEN Available_in_Video = 'Yes' THEN 1 ELSE 0 END)) = 1 THEN 'Yes' ELSE 'No' END) AS Available_in_Video,
FROM <YourTable>
GROUP BY TITLE

【讨论】:

  • 我知道我不应该评论“谢谢”,但非常感谢!它确实成功地将它们分组,并且与我曾经检查过的另一个参数相符。我现在就去阅读案例,谢谢!
  • 如果它帮助您考虑将我的答案标记为答案。谢谢;-)
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2021-04-13
  • 2015-10-02
  • 2021-12-07
相关资源
最近更新 更多