2012-08-13 70 views
0

我有兩個簡單的列:datetime PayDateint Amount 我試圖寫一個查詢,每天分開計數Amount但它不起作用。別名列SQL

SELECT YEAR(PayDate) + '/' + MONTH(PayDate) + '/' + DAY(PayDate) as a, 
COUNT(Amount) as b 
FROM TABLE1 
GROUP BY a,b 

謝謝你的幫忙。

+0

你使用SQL Server或MySQL?你是否意外標記了兩個或更多的網絡? – 2012-08-13 15:22:00

+0

嗨,我標記都是因爲語法是相同的。 – 2012-08-13 15:24:23

+1

那是放肆的;它可能不是。例如,我的答案有代碼可以在SQL Server上工作,但不能在MySQL上工作。如果您試圖獲得與這兩種平臺兼容的通用代碼,則應該明確陳述,而不是強迫人們從您的代碼中做出假設。也意識到它並不總是可能的。 – 2012-08-13 15:26:03

回答

2

你爲什麼這一切混亂的字符串連接困擾?如果您想要特定輸出,請在客戶端上格式化。儘可能使用基本類型而不是字符串。

SELECT CONVERT(DATE, PayDate) AS a, COUNT(Amount) AS b 
FROM dbo.TABLE1 
GROUP BY CONVERT(DATE, PayDate); 

如果你有合理複雜的表達式,以避免重複它是使用子查詢或CTE最簡單的方法:

SELECT a, COUNT(b) FROM 
(SELECT CONVERT(DATE, PayDate) AS a, Amount AS b FROM dbo.TABLE1) AS x 
GROUP BY a; 

-- or 

WITH x(a,b) AS 
(SELECT CONVERT(DATE, PayDate), Amount FROM dbo.TABLE1) 
SELECT a, COUNT(b) FROM x 
GROUP BY a; 

(我不知道你爲什麼被兩個分組a和b在你的問題中。)

+0

非常感謝你 – 2012-08-13 15:52:04

+0

如果我想在'mysql'中做到這一點呢?它有什麼不同? – 2012-08-13 15:54:04

+0

@masoud是的,可能。我不使用MySQL,但是當你提出一個雙管齊下的問題時,這就是你面臨的問題,並不是所有的答案都適合你的整個問題。 – 2012-08-13 15:54:59

3

至少在SQL Server中,不能在GROUP BY語句中使用別名。你必須重複說明。

傷心,但是的確如此。

SELECT YEAR(PayDate) + '/' + MONTH(PayDate) + '/' + DAY(PayDate) as a, 
COUNT(Amount) as b 
FROM TABLE1 
GROUP BY YEAR(PayDate) + '/' + MONTH(PayDate) + '/' + DAY(PayDate),COUNT(Amount) 
+2

'COUNT(金額)'在GROUP BY列表中沒有意義。 – 2012-08-13 15:21:11

+0

將varchar值「/」轉換爲數據類型int時轉換失敗。 – 2012-08-13 15:47:10

0

你不能在GROUP BY語句中使用別名。並且無需使用GROUP BY Count(Amount)

SELECT YEAR(PayDate) + '/' + MONTH(PayDate) + '/' + DAY(PayDate) as a, 
COUNT(Amount) as b 
FROM TABLE1 
GROUP BY YEAR(PayDate) + '/' + MONTH(PayDate) + '/' + DAY(PayDate) 

或者其他方式在SQL Server中做到這一點:

SELECT Convert(varchar(20),PayDate,111) as a, 
COUNT(Amount) as b 
FROM TABLE1 
GROUP BY Convert(varchar(20),PayDate,111) 

Cast and Convert

0

在MySQL上,你也可以得到日期時間列的日期,只需購買使用。我不知道爲什麼你會在這種情況下通過別名b分組。在大多數情況下,您可能還想按日期值排序。

SELECT DATE(PayDate) as a, COUNT(Amount) as b 
FROM TABLE1 
GROUP BY a 
ORDER BY a