Sql 如何组合两个选择或两个查询?

Sql 如何组合两个选择或两个查询?,sql,sql-server,Sql,Sql Server,我有两个问题。第一: SELECT TOP 10 NewsItemTitle , COUNT(1) AS CounterNews FROM [ACTIVITY] WHERE [UserLocation] = 'United States' GROUP BY NewsItemTitle ORDER BY CounterNews DESC 给我这个: NewsItemTitle

我有两个问题。第一:

SELECT TOP 10   NewsItemTitle
            ,   COUNT(1) AS CounterNews
FROM [ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
给我这个:

NewsItemTitle                                                        CounterNews
Afinan plan para casas con cuota de $180.000 por mes                      5
The Exploratoreum's STEM seller                                           4
Witnesses at Hasan trial describe carnage of Ft. Hood shootings.          2
U.S. returns to FIFA top 20 after two-year absence                        2
Sunnyvale: Police shoot and kill man; body of woman found inside house    1
...
此外,我想在该查询中添加字段
[NewsItemUrl]
[NewsItemPublisher]

SELECT  [NewsItemUrl]
    ,   [NewsItemPublisher]
FROM [ACTIVITY]
那么,如何将这两个查询组合成一个呢?

试试这一个-

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl] = MAX([NewsItemUrl])
    , [NewsItemPublisher] = MAX([NewsItemPublisher])
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
还是这个-

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY 
       NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
ORDER BY CounterNews DESC
试试这个-

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl] = MAX([NewsItemUrl])
    , [NewsItemPublisher] = MAX([NewsItemPublisher])
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
还是这个-

SELECT TOP 10
      NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
    , COUNT(1) AS CounterNews
FROM dbo.[ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY 
       NewsItemTitle 
    , [NewsItemUrl]
    , [NewsItemPublisher]
ORDER BY CounterNews DESC

如果我理解正确,您希望包括两列,这两列不属于
分组依据
。这通常是不允许的,您必须将它们包括在组中,或者以另一种方式将它们聚合(例如
MIN/MAX/COUNT

但您可以在公共表表达式中使用类似的
行号

WITH CTE AS
(
    SELECT NewsItemTitle, 
           NewsItemUrl, NewsItemPublisher,
           CounterNews = COUNT(*) OVER (PARTITION BY NewsItemTitle),
           RN = ROW_NUMBER() OVER (PARTITION BY NewsItemTitle ORDER BY CounterNews DESC)
    FROM [ACTIVITY] 
    WHERE [UserLocation] = 'United States' 
)
SELECT TOP 10 * 
FROM CTE 
WHERE RN = 1

正如您所看到的,该子句也适用于聚合函数,如
COUNT
,它允许在不使用
groupby
的情况下对每个组进行计数。如果我理解正确,您希望包含两列,这两列不属于
groupby
。这通常是不允许的,您必须将它们包括在组中,或者以另一种方式将它们聚合(例如
MIN/MAX/COUNT

但您可以在公共表表达式中使用类似的
行号

WITH CTE AS
(
    SELECT NewsItemTitle, 
           NewsItemUrl, NewsItemPublisher,
           CounterNews = COUNT(*) OVER (PARTITION BY NewsItemTitle),
           RN = ROW_NUMBER() OVER (PARTITION BY NewsItemTitle ORDER BY CounterNews DESC)
    FROM [ACTIVITY] 
    WHERE [UserLocation] = 'United States' 
)
SELECT TOP 10 * 
FROM CTE 
WHERE RN = 1

正如您所看到的,该子句也适用于聚合函数,如
COUNT
,它允许在不使用
groupby
的情况下对每个组进行计数。我同意Devart的回答,但是如果您不想按NewsItemUrl和NewsItemPublisher进行分组,那么这里有另一种方法可以实现

SELECT DISTINCT [NewsItemUrl]
     ,  [NewsItemPublisher]
    , TMP.NewsItemTitle
    , CounterNews
FROM [ACTIVITY] ACT
INNER JOIN 
(
SELECT TOP 10   NewsItemTitle
            ,   COUNT(1) AS CounterNews
FROM [ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
) TMP ON ACT.NewsItemTitle = TMP.NewsItemTitle

我同意Devart的回答,但如果您不想按NewsItemUrl和NewsItemPublisher进行分组,这里有另一种方法可以实现

SELECT DISTINCT [NewsItemUrl]
     ,  [NewsItemPublisher]
    , TMP.NewsItemTitle
    , CounterNews
FROM [ACTIVITY] ACT
INNER JOIN 
(
SELECT TOP 10   NewsItemTitle
            ,   COUNT(1) AS CounterNews
FROM [ACTIVITY]
WHERE [UserLocation] = 'United States'
GROUP BY NewsItemTitle
ORDER BY CounterNews DESC
) TMP ON ACT.NewsItemTitle = TMP.NewsItemTitle

您想要的输出是什么样子的?一个NewsItemTitle有多个URL吗?如果是,结果应该是什么样子?谢谢@TToni,每条新闻都有一个发布者和url,如果按标题分组,我还必须显示标题的相应url和发布者。我的意思是,如果我按标题分组,一个标题也对应于一个url和一个发布者。你想要的输出是什么样子的?一个NewsItemTitle有多个url吗?如果是,结果应该是什么样子?谢谢@TToni,每条新闻都有一个发布者和url,如果按标题分组,我还必须显示标题的相应url和发布者。我的意思是,如果我按标题分组,一个标题也对应于一个url和一个发布者。这可能有点过早,取决于OP想要什么。也许在组中包括Url和发布者是更好的选择。@t我可能是对的。正在等待用户答复…:)这些脚本工作正常,符合预期。我的意思是,我是按标题分组的,但是每一条有标题的新闻也有一个url和关联的发布者。反应很好!,谢谢你们@另外,我必须说第一个脚本工作正常。第二个脚本工作正常,给我带来了好处,但返回的数据并不完全相同。但是,谢谢你!这可能有点过早,取决于OP想要什么。也许在组中包括Url和发布者是更好的选择。@t我可能是对的。正在等待用户答复…:)这些脚本工作正常,符合预期。我的意思是,我是按标题分组的,但是每一条有标题的新闻也有一个url和关联的发布者。反应很好!,谢谢你们@另外,我必须说第一个脚本工作正常。第二个脚本工作正常,给我带来了好处,但返回的数据并不完全相同。但是,谢谢你!嗯,我在“=”附近生成错误消息102,级别15,状态1,第6行语法不正确。@Makito:可能缺少逗号,您使用的是哪个版本的sql server?嗯,我在“=”附近生成错误消息102,级别15,状态1,第6行语法不正确。@Makito:可能缺少逗号,您使用的是哪个版本的sql server?