Sql 在一个查询中使用两个Select语句返回所需的数据集

Sql 在一个查询中使用两个Select语句返回所需的数据集,sql,sql-server,Sql,Sql Server,请帮助更正此查询 我想把上周w1的交易金额带回来,然后是年初至今的交易金额。但是查询一直失败,我知道有一个更简单的解决方案,但我不想寻找,因为我想了解使用多个select语句按照第一个select语句返回一个数据集的想法 另外,我想按登录ID分组,但我知道我只能有一个from语句 我的问题是: SELECT login, W1.TRADE_AMT, YTD.TRADE_AMT FROM (SELECT sum(TRADE_AMT) FROM CORPS WHERE DATE >

请帮助更正此查询

我想把上周w1的交易金额带回来,然后是年初至今的交易金额。但是查询一直失败,我知道有一个更简单的解决方案,但我不想寻找,因为我想了解使用多个select语句按照第一个select语句返回一个数据集的想法

另外,我想按登录ID分组,但我知道我只能有一个from语句

我的问题是:

SELECT login, W1.TRADE_AMT, YTD.TRADE_AMT
FROM 
(SELECT sum(TRADE_AMT) FROM CORPS
    WHERE DATE > 20180903 AND DATE_ID <= 20180910 
    AND REGION = 'London'
    AND Rating = 'High'
    AND LOGIN IN ('ITI1','RAB0','RR12') ) AS W1

UNION ALL

(SELECT sum(TRADE_AMT) FROM CORPS
    WHERE DATE > 20180101 AND DATE_ID < 20180911 
    AND REGION = 'London'
    AND Rating = 'High'
    AND LOGIN IN ('ITI1','RAB0','RR12') ) AS YTD


GROUP BY login
预期结果:

Login       W1_Volume   YTD_Volume
ITI1        100         2000
RAB0        150         2500
RR12        25          3000

登录时可能正在对子查询组使用内部联接

    SELECT W1.login, W1.TRADE_AMT, YTD.TRADE_AMT
    FROM 
    (SELECT login, sum(TRADE_AMT) AS TRADE_AMT FROM CORPS
        WHERE DATE > 20180903 AND DATE_ID <= 20180910 
        AND REGION = 'London'
        AND Rating = 'High'
        AND LOGIN IN ('ITI1','RAB0','RR12') 
      GROUP BY LOGIN) AS W1
    LEFT JOIN (
    SELECT login, sum(TRADE_AMT) AS TRADE_AMT FROM CORPS
    WHERE DATE > 20180101 AND DATE_ID < 20180911 
        AND REGION = 'London'
        AND Rating = 'High'
        AND LOGIN IN ('ITI1','RAB0','RR12') 
        GROUP BY LOGIN ) AS YTD ON YTD.LOGIN =  W1.LOGIN 

左侧连接显示也不匹配登录值,但如果您需要周和年之间的oly匹配登录,则可以使用内部连接

根据我得到的示例,您需要第一个子查询的最小交易金额,但未正确获得第二个子查询聚合函数

SELECT login, W1.TRADE_AMT, YTD.TRADE_AMT
FROM 
(SELECT login,min(TRADE_AMT) as TRADE_AMT  FROM CORPS
    WHERE DATE > '20180903' AND DATE_ID <= '20180910' 
    AND REGION = 'London'
    AND Rating = 'High'
    AND LOGIN IN ('ITI1','RAB0','RR12') 
 group by login) AS W1

  join

(SELECT login, sum(TRADE_AMT) as TRADE_AMT FROM CORPS
    WHERE DATE > '20180101' AND DATE_ID < '20180911' 
    AND REGION = 'London'
    AND Rating = 'High'
    AND LOGIN IN ('ITI1','RAB0','RR12') 
    group by login
 ) AS YTD
on W1.login=YTD.login
只需使用用例表达式进行条件聚合:

SELECT login,
       sum(case when DATE > 20180903 AND DATE_ID <= 20180910 then TRADE_AMT end) W1_Volume, 
       sum(case when DATE > 20180101 AND DATE_ID < 20180911 then TRADE_AMT end) YTD_Volume
FROM CORPS
WHERE REGION = 'London'
  AND Rating = 'High'
  AND LOGIN IN ('ITI1','RAB0','RR12')
GROUP BY login

底线是,当您将外部查询与联合组合在一起时,不能从内部查询中选择W1.something,YTD.something。它们被融合到一个结果集中。合并时,必须在结果集中留下线索,以了解行的有趣之处:

SELECT [login], TRADE_AMT, amt_type
FROM 
(
  SELECT 
    [login], sum(TRADE_AMT), 'week' as amt_type
  FROM 
    CORPS
  WHERE 
     DATE > 20180903 AND DATE_ID <= 20180910 
     AND REGION = 'London'
     AND Rating = 'High'
     AND [LOGIN] IN ('ITI1','RAB0','RR12') 
  group by 
    [login]

  UNION ALL

  SELECT 
    [login], sum(TRADE_AMT), 'ytd' as amt_type
  FROM 
    CORPS
  WHERE 
    DATE > 20180101 AND DATE_ID < 20180911 
    AND REGION = 'London'
    AND Rating = 'High'
    AND [LOGIN] IN ('ITI1','RAB0','RR12') 
  group by 
    [login]
)
…其中金额类型指示它是来自ytd查询还是来自week查询

这就是联合查询的问题。您可以透视结果集,但这是不必要的……除非您只需要特定格式的结果。这取决于使用结果集的代码

此外,登录是一个保留字…可能应该把它括起来,因为你不是指保留字


根据scaisEdge的回答,您可以在每次登录时使用联接而不是联合在一行上获得结果集,但我假设您正在尝试找出联合方法。

示例数据、所需结果和数据库标记都会非常有用。您只需在子查询中选择sumTRADE\u AMT。因此,您不可能从他们那里访问任何登录或交易金额。UNION ALL从两个查询中获取行,因此您有更多行。选择w1.trade\u amt,ydt.trade\u amt,您将访问列,因此您需要加入。您使用的是哪种产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为使用postgresql、oracle、sql server、db2、…@Ali_M的数据库产品添加一个。您的条件和所需的输出不匹配,因为上周ITI1的值将为空,因为您使用的是>2018-09-03,但当天的值可能您最好将周数据与年数据连接起来,为了避免丢失行。对不起,请检查第三条select语句?在将数据集命名为表时,也应与YTD之前相同?@Ali\M。。谢谢编辑答案删除了部分代码。。非常感谢你通知我。同样,用这个答案,我不知道;在结果集中没有得到登录名,显示模棱两可的列名-有什么想法吗?
  AND DATE > 20180101 AND DATE_ID < 20180911 
SELECT [login], TRADE_AMT, amt_type
FROM 
(
  SELECT 
    [login], sum(TRADE_AMT), 'week' as amt_type
  FROM 
    CORPS
  WHERE 
     DATE > 20180903 AND DATE_ID <= 20180910 
     AND REGION = 'London'
     AND Rating = 'High'
     AND [LOGIN] IN ('ITI1','RAB0','RR12') 
  group by 
    [login]

  UNION ALL

  SELECT 
    [login], sum(TRADE_AMT), 'ytd' as amt_type
  FROM 
    CORPS
  WHERE 
    DATE > 20180101 AND DATE_ID < 20180911 
    AND REGION = 'London'
    AND Rating = 'High'
    AND [LOGIN] IN ('ITI1','RAB0','RR12') 
  group by 
    [login]
)