我有以下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
我做错了什么?
答案 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 分组。
所以我猜你还有几个选择:
从“select into #temp”-query中删除 transactionDate 。我想这不是一个好的选择,或者你已经将它删除了。
按所有选定列分组并汇总第二个查询。
示例(编辑:在我的仓促中我忘了使用聚合。更新):
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