我正在尝试使用Visifire来显示图表数据的项目。它需要一个DataTable。我需要创建一个SQL查询,搜索特定月份的日期列(格式为:2017年11月3日星期五),然后存储该月重复的次数。它必须在所有12个月内完成。这是在Visual Studio的C#中完成的。目前,它在折线图上不显示任何数据。
public DataTable ReadDataMonthlyBooked()
{
// Declare references (for table, reader and command)
DataTable monthlyBookedTable = new DataTable();
SqlDataReader reader;
SqlCommand command;
string selectString = "SELECT COUNT (BookingNum) AS Bookings "
+ "FROM Booking "
+ "WHERE Booking.EndDate LIKE 'January' "
+ "AND Booking.EndDate LIKE 'February' "
+ "AND Booking.EndDate LIKE 'March' "
+ "AND Booking.EndDate LIKE 'April' "
+ "AND Booking.EndDate LIKE 'May' "
+ "AND Booking.EndDate LIKE 'June' "
+ "AND Booking.EndDate LIKE 'July' "
+ "AND Booking.EndDate LIKE 'August' "
+ "AND Booking.EndDate LIKE 'September' "
+ "AND Booking.EndDate LIKE 'October' "
+ "AND Booking.EndDate LIKE 'November' "
+ "AND Booking.EndDate LIKE 'December'";
try
{
// Create a new command
command = new SqlCommand(selectString, cnMain);
// open the connection
cnMain.Open();
command.CommandType = CommandType.Text;
reader = command.ExecuteReader();
// read data from readerObject and load in table
monthlyBookedTable.Load(reader);
reader.Close(); //close the reader
cnMain.Close(); //close the connection
return monthlyBookedTable;
}
catch (Exception ex)
{
return (null);
}
}
这是我当前的SQL查询,我希望它的逻辑错误无可救药,但我不太了解SQL。
答案 0 :(得分:0)
错误发生在您的SQL语句中。
IEnumerable<int> c = codigo_incidencia.Split('#').Select(stringValue => int.Parse(stringValue));
你试图在同一时间记录一年中每个月的月份。
如果我是对的,你会尝试每月获得预订数量。
所以看起来应该更像是
SELECT
COUNT(BookingNum) AS Bookings
FROM
Booking
WHERE
Booking.EndDate LIKE '%January%',
AND Booking.EndDate LIKE '%February%',
AND Booking.EndDate LIKE '%March%',
AND Booking.EndDate LIKE '%April%',
AND Booking.EndDate LIKE '%May%',
AND Booking.EndDate LIKE '%June%',
AND Booking.EndDate LIKE '%July%',
AND Booking.EndDate LIKE '%August%',
AND Booking.EndDate LIKE '%September%',
AND Booking.EndDate LIKE '%October%',
AND Booking.EndDate LIKE '%November%',
AND Booking.EndDate LIKE '%December%',
答案 1 :(得分:0)
选择'2017年11月3日星期五'
SELECT
SUM(CASE WHEN Booking.EndDate LIKE '%January%' THEN 1 ELSE 0 END) AS JanuaryBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%February%' THEN 1 ELSE 0 END) AS FebruaryBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%March%' THEN 1 ELSE 0 END) AS MarchBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%April%' THEN 1 ELSE 0 END) AS AprilBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%May%' THEN 1 ELSE 0 END) AS MayBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%June%' THEN 1 ELSE 0 END) AS JuneBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%July%' THEN 1 ELSE 0 END) AS JulyBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%August%' THEN 1 ELSE 0 END) AS AugustBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%September%' THEN 1 ELSE 0 END) AS SeptemberBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%October%' THEN 1 ELSE 0 END) AS OctoberBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%November%' THEN 1 ELSE 0 END) AS NovemberBookings,
SUM(CASE WHEN Booking.EndDate LIKE '%December%' THEN 1 ELSE 0 END) AS DecemberBookings
FROM
Booking
答案 2 :(得分:0)
你需要一个像这样的小组
SELECT COUNT(BookingNum) as Bookings, MONTH(EndDate) as Month
FROM Booking
GROUP BY MONTH(EndDate)
但是,由于您的EndDate是varchar,您必须提取月份
SELECT COUNT(BookingNum) as Bookings
, SUBSTRING(EndDate,
CHARINDEX(',',EndDate) + 4,
CHARINDEX(' ',EndDate, CHARINDEX(',',EndDate) + 5) - CHARINDEX(',',EndDate) + 4)
FROM Booking
GROUP BY SUBSTRING(EndDate,
CHARINDEX(',',EndDate) + 4,
CHARINDEX(' ',EndDate, CHARINDEX(',',EndDate) + 5) - CHARINDEX(',',EndDate) + 4)
可能有一种更好的方法可以做到这一点(游标可能?)但基本上你想获得第一个','的位置,并添加4来获得月份(假设日期总是2个数字,就像你的例子中一样)然后使用它作为搜索第一个空白的起始索引(这将是月份名称的结尾)并减去我们找到的第一个索引以获得该月的长度。
所以,基本上,只需将日期更改为DATE字段即可 或者施展它
SELECT COUNT(BookingNum) as Bookings, MONTH(CONVERT(DATE, EndDate)) as Month
FROM Booking
GROUP BY MONTH(CONVERT(DATE, EndDate))
但我不知道您使用的格式是否会由引擎正确解释。