2016-05-05 13 views
-1

Ich habe eine Liste von Monaten, die in meine DB gefüllt werden. Diese Monate werden dann in eine Dropdown-Liste für eine Webanwendung eingetragen. Der Client möchte, dass der aktuelle Monat die Standardoption in der Dropdown-Liste ist. Die Daten des aktuellen Monats sind jedoch nicht immer verfügbar (oder ActiveFlag = Y in der Datenbank). In diesem Fall möchte der Client stattdessen den Standardwert für den ersten Monat des Jahres angeben.SELECT oben 1 absteigend, wenn DB aktuelle Daten enthält, sonst wählen Sie oben 1 aufsteigend

Also teste ich, dass die Dropdown-Liste und die DB-Tabelle mit Selenium-Automatisierung mit C# übereinstimmen. Ich habe eine SQL-Abfrage, die die Top 1 in absteigender Reihenfolge sortiert zurückgibt (Dies funktioniert die letzten aktiven Monat im Jahr zurückzukehren, da BroadcastMonthofYearNbr ganzen Zahlen 1 bis 12 Monate Zahlen enthält):

SELECT top 1 CONCAT(RTRIM(left(M.Name, CHARINDEX(',',M.Name)-1)), ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), M.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), M.EndDate, 101), '/0', '/'), 1, 1, ''), ')') 
      FROM [AudienceProjections].[dbo].[BroadcastCalendarQuarterMonthMap] QMP, 
       AudienceProjections.dbo.BroadcastCalendarYear Y, 
       AudienceProjections.dbo.BroadcastCalendarMonth M, 
       AudienceProjections.dbo.BroadcastCalendarQuarter Q 
      WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
       AND q.BroadcastCalendarQuarterUuid = qmp.BroadcastCalendarQuarterUuid 
       AND qmp.BroadcastCalendarMonthUuid = m.BroadcastCalendarMonthUuid 
       AND M.ActiveStatus = 'ACTIVE' 
       AND y.ActiveStatus = 'ACTIVE' 
       AND q.BroadcastQuarterType = 'STANDARD' 
       AND y.BroadcastCalendarYear = YEAR(GETDATE()) 
      ORDER BY qmp.BroadcastMonthofYearNbr DESC 

Die obige Abfrage gibt diese :

No Column Name April (3/28/2016-4/24/2016)

Der aktuelle Monat für, wenn ich diese Frage bin Entsendung ist 5. Mai. Beachten Sie, dass das obige Abfrageergebnis April und nicht Mai zurückgibt. Dies liegt daran, dass May-Daten noch nicht in die DB importiert wurden (siehe Tabelle unten, um zu unterscheiden, ob die Daten vorhanden sind oder nicht. Ie Aktiv versus Inaktiv). Also wird meine Anfrage in diesem Fall nicht funktionieren. Ich muß jetzt ein CASE THEN ELSE oder eine IF EXISTS Art der Funktion, im Januar zurück, wenn diese Situation

Hier tritt die Monatstabelle, die Sie Mai als inaktives haben sehen können:

Name   StartDate EndDate  ActiveStatus 
January, 2016 2015-12-28 2016-01-31 ACTIVE 
February, 2016 2016-02-01 2016-02-28 ACTIVE 
March, 2016 2016-02-29 2016-03-27 ACTIVE 
April, 2016 2016-03-28 2016-04-24 ACTIVE 
May, 2016  2016-04-25 2016-05-29 INACTIVE 

HINWEIS: Ich habe vergessen über die Situation des aktuellen Datums, der Januar ist, und wenn Januar nicht da ist, dann würde das Jahr auch noch dort nicht sein. Die Bedingung in der Abfrage müsste also Year berücksichtigen. Die Jahrestabelle (BroadcastCalendarYear) verfügt auch über eine ActiveStatus-Spalte, die verwendet werden kann.

Also wenn das Jahr auch inaktiv ist, dann gib mir eine Zeichenfolge zurück, die sagt "Keine Daten in DB für Year".

+2

Was ist die Frage? Wie schreibe ich einen CASE-Ausdruck? –

+0

Wie schreibe ich einen Ausdruck innerhalb dieser Abfrage oben, um die Ergebnisse zu erhalten, die ich brauche. Was ich brauche, ist der aktuelle Monat, wenn es AKTIV ist, andernfalls den ersten Monat des Jahres. Beachten Sie, dass ich am Ende eine Tabelle hinzugefügt habe, um die Zellen "Aktiv" und "Inaktiv" in der Tabelle "Monat" anzuzeigen. –

+1

Und was hat das mit C# oder Visual Studio zu tun (was Sie getaggt haben)? – Transcendent

Antwort

0

Ich gehe davon aus, dass Sie in der Lage sein werden, das Folgende an Ihr spezifisches Schema anzupassen, aber hier ist ein Beispiel, da Reihenfolge funktionieren würde. Beachten Sie, dass Sie möglicherweise einige der where-Anweisungen nicht benötigen und entfernen sollten, ohne den Datensatz zu kennen.

Auch welcher Monat sollte zurückgegeben werden, wenn es Januar des aktuellen Jahres ist und nichts aktiv ist? Sie müssen möglicherweise die Reihenfolge anpassen, abhängig von dieser Antwort.

SELECT TOP 1 * 
FROM 
    @Months 
WHERE 
    ActiveStates = 'ACTIVE' 
    AND ???? 
ORDER BY 
    CASE WHEN YEAR(GETDATE()) = YearInt THEN 9999 ELSE YearInt END DESC -- Assumes you want to order by most recent to oldest and that youcould potentially have a future year loaded in the table. Othwerwuse simply use YearInt DESC 
    ,CASE WHEN MONTH(GETDATE()) = MonthInt THEN 0 ELSE 1 END --Puts precedence on current month 
    ,MonthInt DESC 
0

Ich hoffe, das hilft.

IF OBJECT_ID(N'tempdb..#Month') IS NOT NULL 
DROP TABLE #Month 
CREATE TABLE #Month 
(Year INT, Month VARCHAR(3), ActiveStatus CHAR(1)) 


INSERT INTO #Month(Year, Month, ActiveStatus) 
VALUES(2016,'Jan','A') 
,(2016,'Feb','A') 
,(2016,'Mar','A') 
,(2016,'Apr','A') 
,(2016,'May','I') 

;WITH x AS 
(
SELECT 
*,EOMONTH(CONCAT(Year,'-',Month,'-','01')) As Date 
FROM #Month 
) 
SELECT 
* 
FROM X 
WHERE 
-- current month is active or current month is inactive then first month of the current year 
Year = YEAR(GETDATE()) AND 
(DATEPART(MONTH,Date)=DATEPART(MONTH,GETDATE()) AND ActiveStatus='A') OR  (1=DATEPART(MONTH,Date) AND EXISTS(SELECT 1 FROM x WHERE  DATEPART(MONTH,Date)=DATEPART(MONTH,GETDATE()) AND ActiveStatus='I')) 
0

Ich fand es mit einer langen und gewundenen Lösung, aber es funktioniert.

SELECT CASE WHEN t.month = (SELECT left(M.Name, CHARINDEX(',',M.Name)-1) FROM [AudienceProjections].[dbo].[BroadcastCalendarMonth] M 
      WHERE StartDate <= GETDATE() AND EndDate >= GETDATE()) THEN CONCAT(RTRIM(left(t.Name, CHARINDEX(',',t.Name)-1)), ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), t.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), t.EndDate, 101), '/0', '/'), 1, 1, ''), ')') ELSE (SELECT CONCAT(RTRIM(left(M.Name, CHARINDEX(',',M.Name)-1)), ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), M.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), M.EndDate, 101), '/0', '/'), 1, 1, ''), ')') FROM AudienceProjections.dbo.BroadcastCalendarMonth M WHERE NAME = CONCAT(DATENAME(month,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), ', ', DATENAME(year,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) )) END month FROM (     
     SELECT top 1 left(M.Name, CHARINDEX(',',M.Name)-1) AS month, 
     M.Name, M.StartDate, M.EndDate 
     FROM [AudienceProjections].[dbo].[BroadcastCalendarQuarterMonthMap] QMP, 
       AudienceProjections.dbo.BroadcastCalendarYear Y, 
       AudienceProjections.dbo.BroadcastCalendarMonth M, 
       AudienceProjections.dbo.BroadcastCalendarQuarter Q 
      WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
       AND q.BroadcastCalendarQuarterUuid = qmp.BroadcastCalendarQuarterUuid 
       AND qmp.BroadcastCalendarMonthUuid = m.BroadcastCalendarMonthUuid 
       AND M.ActiveStatus = 'ACTIVE' 
       AND q.BroadcastQuarterType = 'STANDARD' 
      AND y.ActiveStatus = 'ACTIVE' 
       AND y.BroadcastCalendarYear = YEAR(GETDATE()) 
      ORDER BY qmp.BroadcastMonthofYearNbr DESC) t 
0

Mit IF EXISTS, ELSE IF EXISTS, erreicht ELSE alle drei Bedingungen:

IF EXISTS (
SELECT CONCAT(q.DisplayName, ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.EndDate, 101), '/0', '/'), 1, 1, ''), ')') 
FROM AudienceProjections.dbo.BroadcastCalendarYear Y, 
    AudienceProjections.dbo.BroadcastCalendarQuarter Q 
WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
     AND q.BroadcastQuarterType = 'STANDARD' 
     AND y.ActiveStatus = 'ACTIVE' 
     AND q.ActiveStatus = 'ACTIVE' 
     AND y.BroadcastCalendarYear = YEAR(GETDATE()) 
      AND Q.StartDate <= GETDATE() 
      and Q.EndDate >= GETDATE()) 
SELECT CONCAT(q.DisplayName, ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.EndDate, 101), '/0', '/'), 1, 1, ''), ')') 
FROM AudienceProjections.dbo.BroadcastCalendarYear Y, 
    AudienceProjections.dbo.BroadcastCalendarQuarter Q 
WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
     AND q.BroadcastQuarterType = 'STANDARD' 
     AND y.ActiveStatus = 'ACTIVE' 
     AND q.ActiveStatus = 'ACTIVE' 
     AND y.BroadcastCalendarYear = YEAR(GETDATE()) 
      AND Q.StartDate <= GETDATE() 
      and Q.EndDate >= GETDATE() ELSE IF EXISTS (
SELECT TOP 1 CONCAT(q.DisplayName, ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.EndDate, 101), '/0', '/'), 1, 1, ''), ')') 
FROM [AudienceProjections].[dbo].[BroadcastCalendarQuarterMonthMap] QMP, 
    AudienceProjections.dbo.BroadcastCalendarYear Y, 
    AudienceProjections.dbo.BroadcastCalendarQuarter Q 
WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
     AND q.BroadcastCalendarQuarterUuid = qmp.BroadcastCalendarQuarterUuid 
     AND q.BroadcastQuarterType = 'STANDARD' 
     AND y.ActiveStatus = 'ACTIVE' 
     AND q.ActiveStatus = 'ACTIVE' 
     AND y.BroadcastCalendarYear = YEAR(GETDATE()) ORDER BY qmp.BroadcastMonthofYearNbr ASC) SELECT TOP 1 CONCAT(q.DisplayName, ' (', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.StartDate, 101), '/0', '/'), 1, 1, ''), '-', STUFF(REPLACE('/'+CONVERT(VARCHAR(10), q.EndDate, 101), '/0', '/'), 1, 1, ''), ')') 
FROM [AudienceProjections].[dbo].[BroadcastCalendarQuarterMonthMap] QMP, 
    AudienceProjections.dbo.BroadcastCalendarYear Y, 
    AudienceProjections.dbo.BroadcastCalendarQuarter Q 
WHERE y.BroadcastCalendarYearUuid = q.BroadcastCalendarYearUuid 
     AND q.BroadcastCalendarQuarterUuid = qmp.BroadcastCalendarQuarterUuid 
     AND q.BroadcastQuarterType = 'STANDARD' 
     AND y.ActiveStatus = 'ACTIVE' 
     AND q.ActiveStatus = 'ACTIVE' 
     AND y.BroadcastCalendarYear = YEAR(GETDATE()) 
ORDER BY qmp.BroadcastMonthofYearNbr ASC; ELSE SELECT 'No Active quarters are in the database for the current year yet'; 
Verwandte Themen