GROUP BY 子句未显示所需结果

GROUP BY clause not showing desired result

我有以下 3 tables:

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

现在我正在对 link 这些 table 使用内部联接,但我没有得到想要的结果,即它没有分组 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

例如,如果 Country 阿联酋有两条记录 Transactions,则它显示的是单独的结果:

(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.Should 的结果分组为

UAE      3      SAR     640.000     0       0.0000

我做错了什么?

如果 TransactionDate 与您的 collection 无关,您应该将其从 select 和分组依据中删除。如果您尝试对交易日期而不是时间进行分组,我建议您在分组依据和语句的 select 部分中使用以下内容。

GROUP BY CAST(transactiondate AS DATE)

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

然后尝试将删除的字段添加回您的分组子句,并将它们也添加到您的 select 列表中 - 您会看到这些字段中至少有一个必须有多个值,而不是单个country_name.

您正在按 transactionDate(以及其他)分组并将该数据放入#temp。第二个查询中没有任何改变,所以结果仍然按 transactionDate 分组,即使你 select 它与否。

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

  1. 从 "select into #temp" 查询中删除 transactionDate。不过我想这不是一个好的选择,否则您早就将其删除了。

  2. 按所有 select 列对第二个查询进行分组和聚合。

示例(编辑:我在匆忙中忘记使用聚合。已更新):

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 

存在逻辑问题。 在第一个查询(进入临时)中,您将一些事情分组到事务 level/date 级别。 (按交易日期分组)。 然后你 select 来自临时的数据,等待按国家/地区分组的数据。

因为您需要交易日期作为第二个查询的标准,所以您也必须对第二个查询(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