【问题标题】:How can I return columns from join while using group by clause?如何在使用 group by 子句时从 join 返回列?
【发布时间】:2019-05-16 03:27:00
【问题描述】:

我正在尝试返回 t1.firstname、t1.lastname、t1.city、t1.stateprovince,并且我想返回 t2.amount、t2.restaurantname、t2.restaurantnum、t2.datekey 和 t2.amount也是。

这是我的代码:

SELECT DISTINCT 
    t1.[FirstName] AS FirstName,
    t1.[LastName] AS LastName,
    t1.[City] AS City,
    t1.[StateProvince] AS StateProvince
FROM 
    Database.dbo.CustomerData t1
JOIN 
    (SELECT DISTINCT
         MAX(t2.[Amount]) AS Amount,
         MAX(t2.[Account]) AS Account,
         MAX(t2.[CardNumber]) AS CardNumber,
         MAX(t2.[RestaurantNum]) AS RestaurantNum,
         MAX(t2.[RestaurantName]) AS RestaurantName,
         MAX(t2.[DateKey]) AS DateKey,
         SUM([t2].[Amount]) AS Total_Spend
     FROM 
         gift.TransactionItems t2
     GROUP BY 
         t2.[Amount],
         t2.[RestaurantNum],
         t2.[RestaurantName],
         t2.[DateKey],
         t2.[AccountID],
         t2.[TransactionID]) t2 ON t1.[CardNumber] = t2.[CardNumber]
WHERE
    [FirstName] IS NOT NULL
    AND [LastName] IS NOT NULL
    AND [EmailFailed] IS NULL       
    AND [IsRegistered] = 'Yes'
    AND [DateKey] BETWEEN 20180601 AND 20181213
    AND t2.[Account] = 'Dollars_Spent_Accrued'

这可能吗?它目前只返回 t1.firstname、t1.lastname、t1.city 和 t1.stateprovince。

【问题讨论】:

    标签: sql sql-server join group-by ssms


    【解决方案1】:

    如果在添加列时查询不起作用,那么我会将 t2 查询放入临时表中,然后进行连接,看看是否效果更好。经过一定程度的复杂性后,我通常会选择临时表并将其分解:

    drop table if exists #t2
    SELECT DISTINCT
             MAX(t2.[Amount]) AS Amount,
             MAX(t2.[Account]) AS Account,
             MAX(t2.[CardNumber]) AS CardNumber,
             MAX(t2.[RestaurantNum]) AS RestaurantNum,
             MAX(t2.[RestaurantName]) AS RestaurantName,
             MAX(t2.[DateKey]) AS DateKey,
             SUM([t2].[Amount]) AS Total_Spend
         INTO #t2 FROM 
             gift.TransactionItems t2
         GROUP BY 
             t2.[Amount],
             t2.[RestaurantNum],
             t2.[RestaurantName],
             t2.[DateKey],
             t2.[AccountID],
             t2.[TransactionID]
    

    【讨论】:

    • 谢谢,我会试一试的。
    【解决方案2】:

    查询的第一部分列出了将返回的值。您只列出了来自t1 的值,尽管来自t2 的列包含在查询的FROM 段中。您需要将它们显式添加到查询的 SELECT 段中。让我知道这是否适合您。

    SELECT DISTINCT 
        t1.[FirstName] AS FirstName,
        t1.[LastName] AS LastName,
        t1.[City] AS City,
        t1.[StateProvince] AS StateProvince
        t2.[amount], 
        t2.[restaurantname], 
        t2.[restaurantnum], 
        t2.[datekey]
    FROM 
        Database.dbo.CustomerData t1
    JOIN 
        (SELECT DISTINCT
             MAX(t2.[Amount]) AS Amount,
             MAX(t2.[Account]) AS Account,
             MAX(t2.[CardNumber]) AS CardNumber,
             MAX(t2.[RestaurantNum]) AS RestaurantNum,
             MAX(t2.[RestaurantName]) AS RestaurantName,
             MAX(t2.[DateKey]) AS DateKey,
             SUM([t2].[Amount]) AS Total_Spend
         FROM 
             gift.TransactionItems
         GROUP BY 
             t2.[Amount],
             t2.[RestaurantNum],
             t2.[RestaurantName],
             t2.[DateKey],
             t2.[AccountID],
             t2.[TransactionID]) t2 ON t1.[CardNumber] = t2.[CardNumber]
    WHERE
        [FirstName] IS NOT NULL
        AND [LastName] IS NOT NULL
        AND [EmailFailed] IS NULL       
        AND [IsRegistered] = 'Yes'
        AND [DateKey] BETWEEN 20180601 AND 20181213
        AND t2.[Account] = 'Dollars_Spent_Accrued'
    

    【讨论】:

    • 这不起作用。不幸的是,它现在无法识别 t1 值。
    • Msg 102,级别 15,状态 1,第 6 行 't2' 附近的语法不正确。消息 156,级别 15,状态 1,第 30 行关键字“ON”附近的语法不正确。
    • 我认为这是因为 t2 在您的查询中被引用了两次,请尝试取出它的第一个实例。我会更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多