GROUP BY查询文本列

时间:2014-05-02 08:14:44

标签: sql sql-server sql-server-2008

我正在使用查询,我想按1个特定列对它们进行分组。我得到了GROUP BY子句中没有列出的其他字段的错误,是的我知道我应该告诉Sql Server一行按行分组,你应该选择,但我不知道该怎么做。如果我使用MIN()函数并且如果它是文本字段我不知道该怎么做。 我想选择所有数据,如果复制videos.number,videos.title而不是获取第一行分组行。此查询的作用是:根据客户端订阅从包中获取所有通道。有时不同的套餐有相同的渠道,我不希望这个渠道向客户展示两次。

USE [DB]

 SELECT Videos.number,
        Videos.title,
        Videos.description,
        Videos.format,
        Videos.urlTwo AS url,
        Videos.icon,
        Videos.streamtype,
        'pin' AS password,
        Videos.categoryid,
        Videos.videotype,
   FROM subscription
        INNER JOIN packages_channels
            ON subscription.pkgid = packages_channels.package_id 
        INNER JOIN Videos 
            ON packages_channels.video_id = Videos.number
  WHERE (GETDATE() >= subscription.startdate) 
    AND (GETDATE() <= subscription.enddate) 
    AND (subscription.username = 'mon1')
  GROUP BY videos.number, Videos.title
  ORDER BY Videos.number asc

这就是它现在所显示的:

number  title        description  format    url                      icon 
101     channel1     101          101       URLstream1               iconPath1
101     channel1     101          101       URLstream1               iconPath1  
102     channel2     101          102       URLstream2               iconPath2
107     channel7     107          107       URLstream7               iconPath7
108     channel8     108          108       URLstream8               iconPath8

但我想得到的结果是:

   number  title        description  format    url                      icon 
    101     channel1     101          101       URLstream1               iconPath1  
    102     channel2     101          102       URLstream2               iconPath2
    107     channel7     107          107       URLstream7               iconPath7
    108     channel8     108          108       URLstream8               iconPath8

因为你看到channel1只有一次 网址和图标是问题所在。这个字段是文本

出于安全原因,我无法显示真实的sql结果。

3 个答案:

答案 0 :(得分:1)

我不认为你真的需要一个小组,因为你没有使用任何聚合功能。 使用distinct有望完成下面的工作

 SELECT DISTINCT
        Videos.number,
        Videos.title,
        Videos.description,
        Videos.format,
        convert(varchar(max),Videos.urlTwo) AS url,
        convert(varchar(max),Videos.icon) as icon,
        Videos.streamtype,
        'pin' AS password,
        Videos.categoryid,
        Videos.videotype
   FROM subscription
        INNER JOIN packages_channels 
            ON subscription.pkgid = packages_channels.package_id
        INNER JOIN Videos 
            ON packages_channels.video_id = Videos.number
  WHERE (GETDATE() >= subscription.startdate)
    AND (GETDATE() <= subscription.enddate)
    AND (subscription.username = 'mon1')
  ORDER BY Videos.number asc

答案 1 :(得分:0)

如果描述和格式等其他列在功能上依赖于您要分组的列,则只需将它们包含在group by子句中即可。

功能依赖性意味着该列对于其功能依赖的列的特定值始终具有相同的值。

如果它们不依赖于功能,那么这根本不起作用,因为如果对一个数字有不同的描述,SQL Server如何确定要显示哪个描述?

解决此问题的一种方法是使用MAX(描述)。这使得按字母顺序排列的描述可以任意选择。

答案 2 :(得分:0)

您也可以对文本列使用MIN()或MAX()。

你有很多解决方案。请检查此帖子Retrieving the last record in each group