2017-11-02 3 views
1

Visifireを使用してグラフ化されたデータを表示するプロジェクトを実行しようとしています。単一のDataTableを取り込みます。特定の月の日付列を検索するSQLクエリを作成する必要があります(形式は:2017年11月3日金曜日)。その後、その月が何回繰り返されたかを格納します。これは12ヶ月間すべてこれを行う必要があります。これはVisual StudioのC#で行われます。現在、折れ線グラフ上にデータは表示されません。SQL Server:異なる月の出現を検索

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

あなたが12月に2回ある以外は、予約とは何ですか?もしそれが日付の場合は、その1/1/2018を格納する場合は?あなたの日付のどれもプラスしていますが、それがうまくいけば12ヶ月間リストされているので、毎月ではなくすべてのものをカウントします。 – BugFinder

+0

日付であればそれは保存されません2010年1月1日(または1月1日、2018年1月1日)または他の文字列形式 - それを日付として格納し、コードはそれを日付として処理する必要があります。 –

+0

申し訳ありませんが、最初の12月は1月を意味します。 Booking.Enddateは、(名前が示すように) 'Booking.Enddate'が実際には - 次に***なぜ***をあなたのように保存しているのでしょうか?(2017年11月3日金曜日) –

答えて

0

エラーはSQL文にあります。

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か月あたりの予約数を取得しようとします。

だから、選択はるか

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 
+0

しかし、彼はすでにEndDateが文字列として格納されていることを確認しています。( – BugFinder

+0

私はそれを見ていませんでした@BugFinder :-) あなたの発言に続いて、 – MinerBigWhale

0

のようになります '2017年11月3日(金曜日)'

select cast('03 November 2017' as date) 

select SUBSTRING('Friday, 03 November 2017', CHARINDEX(',', 'Friday, 03 November 2017') + 2, 100) 

select cast(SUBSTRING('Friday, 03 November 2017', CHARINDEX(',', 'Friday, 03 November 2017') + 2, 100) as date) 

select datepart(month, cast(SUBSTRING('Friday, 03 November 2017', CHARINDEX(',', 'Friday, 03 November 2017') + 2, 100) as date)) 


select datepart(month, cast(Booking.EndDate, CHARINDEX(',', Booking.EndDate) + 2, 100) as date)) 
    , COUNT (BookingNum) AS Bookings " 
from booking 
group by datepart(month, cast(Booking.EndDate, CHARINDEX(',', Booking.EndDate) + 2, 100) as date)) 
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)) 

それを唱えるしかし、あなたが使用しているフォーマットは、エンジンによって正しく解釈されるかどうかはわかりません。

関連する問題