Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 如何将使用top 1子句的查询连接到使用聚合函数的查询?_Sql - Fatal编程技术网

Sql 如何将使用top 1子句的查询连接到使用聚合函数的查询?

Sql 如何将使用top 1子句的查询连接到使用聚合函数的查询?,sql,Sql,我有一个使用TOP 1子句(query2)的查询,我想将它连接到另一个使用聚合函数的查询,但我不确定如何执行 我想要一个如下所示的结果查询: "select Count(*), Avg(AmtSpent), TOP 1 (Outlet_Code)...." 请告知。谢谢 问题1: select Count(*), Avg(AmtSpent) from Transact Where CardNo In (Select CardNo from Card where MemberID = 'Mem0

我有一个使用TOP 1子句(query2)的查询,我想将它连接到另一个使用聚合函数的查询,但我不确定如何执行

我想要一个如下所示的结果查询:

"select Count(*), Avg(AmtSpent), TOP 1 (Outlet_Code)...."
请告知。谢谢

问题1:

select Count(*), Avg(AmtSpent) from Transact Where CardNo In
(Select CardNo from Card where MemberID = 'Mem003')
问题2:

select TOP 1 (Outlet_Code) from Transact where CardNo In
(Select CardNo from Card where MemberID = 'Mem003')
group by Outlet_Code
Order by count(Outlet_Code) desc

类似这样,只要每个子查询只返回一行,情况就是这样,因为您的一个查询正在选择top 1,而另一个查询没有group by子句。这在SQLServer2008中起作用

select TransactCount, TransactAvg, OutletCode
from
(

    select TOP 1 (Outlet_Code) as OutletCode 
    from Transact where CardNo In
    (Select CardNo from Card where MemberID = 'Mem003')
    group by Outlet_Code
    Order by count(Outlet_Code) desc


) rsOutletCode
cross join
(

    select Count(*) as TransactCount, Avg(AmtSpent) as TransactAvg
    from Transact 
    Where CardNo In
    (Select CardNo from Card where MemberID = 'Mem003')

) rsTransact

执行第一个查询并应用另一个查询:

-- Temp tables for demo
CREATE TABLE #Transact (
    ID  INT PRIMARY KEY,
    AmtSpent NUMERIC(18,2),
    CardNo INT,
    Outlet_Code VARCHAR(10)
)

CREATE TABLE #Card (
    CardNo INT PRIMARY KEY,
    MemberID VARCHAR(10)
)

-- Some mock values
INSERT #Card VALUES (1, 'Mem001')
INSERT #Card VALUES (2, 'Mem002')
INSERT #Card VALUES (3, 'Mem003')
INSERT #Card VALUES (4, 'Mem004')
INSERT #Card VALUES (5, 'Mem005')
INSERT #Card VALUES (6, 'Mem006')
INSERT #Card VALUES (7, 'Mem007')
INSERT #Card VALUES (8, 'Mem008')
INSERT #Card VALUES (9, 'Mem009')

INSERT #Transact VALUES (1, 100.0, 1, 'Outlet 1')
INSERT #Transact VALUES (2, 200.0, 1, 'Outlet 2')
INSERT #Transact VALUES (3, 300.0, 2, 'Outlet 3')
INSERT #Transact VALUES (4, 400.0, 2, 'Outlet 4')
INSERT #Transact VALUES (5, 500.0, 3, 'Outlet 5')
INSERT #Transact VALUES (6, 600.0, 8, 'Outlet 6')
INSERT #Transact VALUES (7, 700.0, 9, 'Outlet 7')

DECLARE @MemberID VARCHAR(10)

SET @MemberID = 'Mem002'

-- The query
SELECT
    COUNT(*) AS Count,
    AVG(T.AmtSpent) AS Average,
    _T.Outlet_Code
FROM
    #Transact T

    INNER JOIN #Card C ON
    T.CardNo = C.CardNo

    OUTER APPLY (
        SELECT
            TOP 1 Outlet_Code
        FROM
            #Transact _T

            INNER JOIN #Card C ON
            _T.CardNo = C.CardNo
        WHERE
            C.MemberID = @MemberID
        GROUP BY
            Outlet_Code
    ) AS _T
WHERE
    C.MemberID = @MemberID
GROUP BY
    _T.Outlet_Code

-- Clean up mock stuff
DROP TABLE #Card
DROP TABLE #Transact