GROUP BY子句未显示所需结果

时间:2015-09-21 12:13:52

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

我有以下3个表:

POS_Transactions(TransactionDate,TerminalID,TransactionTypeID,TotalAmount)
Terminal(TerminalID,CountryID)
Country(CountryID,CountryName,CurrencyName)

现在我使用内连接来链接这些表,但我没有得到所需的结果,即它没有分组Country-wise

   SELECT C.countryname      'CountryName', 
       C.currencyname     'CurrencyName', 
       transactiondate, 
       Sum(CASE transactiontypeid 
             WHEN 6 THEN 1 
             ELSE 0 
           END)           'Number of Cards Issue', 
       Sum(CASE transactiontypeid 
             WHEN 6 THEN totalamount 
             ELSE 0 
           END)           'Total Amount Loaded', 
       Count(DISTINCT CASE transactiontypeid 
                        WHEN 4 THEN pan 
                        ELSE NULL 
                      END)'Number of Card Redeemed', 
       Sum(CASE transactiontypeid 
             WHEN 4 THEN 1 
             ELSE 0 
           END)           'Number of Sales Transaction', 
       Sum(CASE transactiontypeid 
             WHEN 4 THEN totalamount 
             ELSE 0 
           END)           'Total Values of Sale Transaction' 
INTO   #temp 
FROM   pos_transactions p 
       INNER JOIN terminal T 
               ON T.terminalid = p.terminalid 
       INNER JOIN country C 
               ON T.countryid = C.countryid 
GROUP  BY transactiondate, 
          C.countryname, 
          C.currencyname, 
          C.countryid 

select [Number of Cards Issue],[Total Amount Loaded], [Number of Card Redeemed],[Number of Sales Transaction],

[Total Values of Sale Transaction],CountryName,CurrencyName from #temp

where (TransactionDate >= @DateFrom)    

and (TransactionDate < @DateTo)   

drop table #temp

例如,如果Transactions阿联酋有两条记录Country,那么它会显示个别结果:

(CountryName,Numbers of Cards Issued,CurrencyName,Total Amount Loaded,Number of Sales Transaction,Total Values of Sale Transaction)

UAE        1         SAR        320.000     0       0.0000

UAE        2         SAR        320.000     0       0.0000

相反,它应该为Country UAE分组结果。应该是

UAE      3      SAR     640.000     0       0.0000

我做错了什么?

4 个答案:

答案 0 :(得分:0)

如果TransactionDate与您的收藏无关,您应该从select和group by中删除它。如果您尝试对交易日期进行分组而不是时间,我建议您在分组中使用以下内容并选择部分陈述。

GROUP BY CAST(transactiondate AS DATE)

答案 1 :(得分:0)

尝试从group by子句中删除不在您的选择列表中的所有字段(不包括聚合函数中的字段),然后您应该获得可理解的结果。

然后尝试将删除的字段添加回group by子句,并将它们添加到您的选择列表中 - 您将看到这些字段中至少有一个字段必须存在多个值,而不是单个country_name。

答案 2 :(得分:0)

您正在通过 transactionDate (以及其他)进行分组,并将该数据放入#temp。第二个查询中没有任何内容更改此内容,因此即使您选择了结果,结果仍然按 transactionDate 分组。

所以我猜你还有几个选择:

  1. 从“select into #temp”-query中删除 transactionDate 。我想这不是一个好的选择,或者你已经将它删除了。

  2. 按所有选定列分组并汇总第二个查询。

  3. 示例(编辑:在我的仓促中我忘了使用聚合。更新):

    SELECT SUM([Number of Cards Issue]), SUM([Total Amount Loaded]), SUM([Number of Card Redeemed]),
       SUM([Number of Sales Transaction]), SUM([Total Values of Sale Transaction]), 
       CountryName, CurrencyName 
    FROM #temp
    WHERE (TransactionDate >= @DateFrom) and (TransactionDate < @DateTo)
    GROUP BY 
       CountryName, CurrencyName 
    

答案 3 :(得分:0)

存在逻辑问题。 在第一个查询(进入临时)中,您将某些内容分组到事务级别/日期级别。 (GROUP BY transactiondate)。 然后从temp中选择此数据,等待按国家/地区分组的数据。

因为您需要在第二个查询中将交易日期作为标准,所以您还必须对第二个查询(FROM temp)进行分组。

或者,要在一个查询中使用它,您必须在第一个查询中放置where子句并从分组中删除transactiondate:

SELECT C.countryname      'CountryName', 
   C.currencyname     'CurrencyName', 
   transactiondate, 
   Sum(CASE transactiontypeid 
         WHEN 6 THEN 1 
         ELSE 0 
       END)           'Number of Cards Issue', 
   Sum(CASE transactiontypeid 
         WHEN 6 THEN totalamount 
         ELSE 0 
       END)           'Total Amount Loaded', 
   Count(DISTINCT CASE transactiontypeid 
                    WHEN 4 THEN pan 
                    ELSE NULL 
                  END)'Number of Card Redeemed', 
   Sum(CASE transactiontypeid 
         WHEN 4 THEN 1 
         ELSE 0 
       END)           'Number of Sales Transaction', 
   Sum(CASE transactiontypeid 
         WHEN 4 THEN totalamount 
         ELSE 0 
       END)           'Total Values of Sale Transaction' 
INTO   #temp 
FROM   pos_transactions p 
   INNER JOIN terminal T 
           ON T.terminalid = p.terminalid 
   INNER JOIN country C 
           ON T.countryid = C.countryid 
where (TransactionDate >= @DateFrom)    
and (TransactionDate < @DateTo)
GROUP  BY C.countryname, 
      C.currencyname, 
      C.countryid