【问题标题】:GROUP BY clause not showing desired resultGROUP BY 子句未显示所需结果
【发布时间】:2015-12-18 03:18:34
【问题描述】:

我有以下 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

相反,它应该对CountryUAE 的结果进行分组。应该是

UAE      3      SAR     640.000     0       0.0000

我做错了什么?

【问题讨论】:

  • 结果中的 1 和 2 是什么?
  • group by 中删除TransactionDate。您可能还需要修复查询的其他部分。
  • 在您的结果中,一列在哪里结束,另一列从哪里开始?在结果集中添加列名。
  • 您的查询与示例数据不匹配。我不喜欢猜谜游戏..
  • 抱歉,我错过了与交易日期相关的部分。它用于过滤记录。我已经编辑了我的帖子

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


【解决方案1】:

您正在按 transactionDate(以及其他)进行分组,并将该数据放入#temp。第二个查询中的任何内容都不会改变这一点,因此即使您选择与否,结果仍按 transactionDate 分组。

所以我猜你有几个选择:

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

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

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

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 

【讨论】:

    【解决方案2】:

    如果 TransactionDate 与您的集合无关,则应将其从 select 和 group by 中删除。如果您尝试对交易日期而不是时间进行分组,我建议您在分组依据中使用以下内容并选择您的声明的部分内容。

    GROUP BY CAST(transactiondate AS DATE)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        有一个逻辑问题。 在第一个查询(进入临时)中,您将一些事情分组到事务级别/日期级别。 (按交易日期分组)。 然后从 temp 中选择此数据,等待按 Country 分组的数据。

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

        【讨论】:

          猜你喜欢
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多