2015-09-21 6 views
3

я следующие 3 таблицы:предложения GROUP BY не показывает желаемого результата

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.Should быть

UAE  3  SAR  640.000  0  0.0000 

Что я делаю неправильно?

+0

что 1 и 2 в результате? –

+2

Удалить 'TransactionDate' из' group by'. Возможно, вам придется исправить и другие части запроса. –

+0

В вашем результате, где заканчивается один столбец и где начинается другое? Добавить имена столбцов в наборе результатов. –

ответ

0

Вы группируете transactionDate (и другие) и помещаете эти данные в #temp. Ничто во втором запросе не изменит это, поэтому результат по-прежнему сгруппирован по transactionDate, даже если вы выберете его или нет.

Так что я предполагаю, что вы остаетесь с несколькими вариантами:

  1. Удалить transactionDate из "выберите в #temp" -query. Я думаю, это не очень хороший вариант, хотя вы бы уже удалили его.

  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 
0

Если TransactionDate не подходит для вашей коллекции, вы должны удалить его как из группы выбора, так и из группы. Если вы пытаетесь сгруппировать дату транзакции, а не время, я могу предложить вам использовать следующее в вашей группе и выбрать части вашего заявления.

GROUP BY CAST(transactiondate AS DATE) 
0

Попробуйте удалить из группы по статье все поля, которые не находятся в вашем списке выбора (за исключением полей в агрегатных функциях), вы должны затем получить вразумительный результат.

Затем попробуйте добавить удаленные поля обратно в предложение group by и добавить их в свой список выбора - вы увидите, что в одном из этих полей должно быть несколько значений по одному имени_страницы.

0

Существует логическая проблема. В первом запросе (в темпе) вы группируете некоторые вещи на уровень транзакции/уровень даты. (GROUP BY transactiondate). Затем вы выбираете эти данные из temp, ожидая данных, сгруппированных по странам.

Поскольку вам нужна дата транзакции в качестве критерия во втором запросе, вам также необходимо сгруппировать этот второй запрос (FROM temp).

ИЛИ, чтобы иметь его в одном запросе, вы должны поставить где-пункт в первом запросе и удалить 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 
Смежные вопросы