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 它与否。
所以我猜你还有几个选择:
从 "select into #temp" 查询中删除 transactionDate。不过我想这不是一个好的选择,否则您早就将其删除了。
按所有 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
我有以下 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 它与否。
所以我猜你还有几个选择:
从 "select into #temp" 查询中删除 transactionDate。不过我想这不是一个好的选择,否则您早就将其删除了。
按所有 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