खाली तालिका - शून्य, एसक्यूएल-सर्वर अगर शून्य के रूप में प्राप्त करें

मेरे पास स्थान की एक सारणी है

SELECT
"location_id",
"location_code",
"location_line_1",
"location_line_2",
"location_line_3",
"location_line_4"
FROM
"location"

और लाता है

1    AM00758    line1    line2    line3    line4
2    PF00517    line1    line2    line3    line4
3    RFTA967    line1    line2    line3    line4

और उस दिन से बने बहिष्करण की संख्या को संग्रहीत करने के लिए दूसरी तालिका

SELECT
"daily_exclusion_id",
"location_id", --From Location
"exclusion_date",
"exclution_absence",
"exclution_no_info",
"exclusion_foregin_info"
FROM
"daily_exclusion"

और लाता है

1    1    2014-06-01    15    32    45
2    2    2014-06-01    23    10    81
3    3    2014-06-01    18    30    70
4    1    2014-06-02    63    34    12
5    2    2014-06-02    34    16    2
6    3    2014-06-02    51    18    9
7    1    2014-06-04    13    18    7
8    2    2014-06-04    18    36    19
9    3    2014-06-04    5     7     29

तो ... इसे स्क्रीन पर भरने के लिए, यह प्रत्येक स्थान को किसी चयनित तिथि के लिए प्रिंट करता है, और आप 3 बहिष्करण को उस बहिष्कार (अनुपस्थिति, कोई जानकारी और फ़ोरगिन जानकारी) का उपयोग करने वाले लोगों की संख्या के साथ भरते हैं।

समस्या: है, कुछ दिन जानकारी खाली है, यदि उपयोगकर्ता दिन 1, 2 पंजीकृत करता है, और 3 याद करता है, लेकिन 4, 5, आदि पर चलता रहता है ... जब मैं चुनता हूं तो यह उन लापता तिथियों को शून्य के रूप में नहीं लाता है

SELECT
l.*, de.*
FROM
location l
LEFT OUTER JOIN
daily_exclusion de
ON (
de.location_id = l.location_id
AND
de.exclusion_date between "20140601" and "20140604" --HERE"S THE DIFFERENCE
)
WHERE
vl.location_id IN (1,2,3)

लेकिन यह केवल पंजीकृत दिनों लाता है

1    AM00758    line1    line2    line3    line4    1    1    2014-06-01    15    32    45
1    AM00758    line1    line2    line3    line4    4    1    2014-06-02    63    34    12
1    AM00758    line1    line2    line3    line4    7    1    2014-06-04    13    18    7
2    PF00517    line1    line2    line3    line4    2    2    2014-06-01    23    10    81
2    PF00517    line1    line2    line3    line4    5    2    2014-06-02    34    16    2
2    PF00517    line1    line2    line3    line4    8    2    2014-06-04    18    36    19
3    RFTA967    line1    line2    line3    line4    3    3    2014-06-01    18    30    70
3    RFTA967    line1    line2    line3    line4    6    3    2014-06-02    51    18    9
3    RFTA967    line1    line2    line3    line4    9    3    2014-06-04    5     7     29

और मुझे दिन 3 के लिए नल की जरूरत है

1    AM00758    line1    line2    line3    line4    1    1    2014-06-01    15    32    45
1    AM00758    line1    line2    line3    line4    4    1    2014-06-02    63    34    12
1    AM00758    line1    line2    line3    line4    null null 2014-06-03    null  null null
1    AM00758    line1    line2    line3    line4    7    1    2014-06-04    13    18    7
2    PF00517    line1    line2    line3    line4    2    2    2014-06-01    23    10    81
2    PF00517    line1    line2    line3    line4    5    2    2014-06-02    34    16    2
2    PF00517    line1    line2    line3    line4    null null 2014-06-03    null  null null
2    PF00517    line1    line2    line3    line4    8    2    2014-06-04    18    36    19
3    RFTA967    line1    line2    line3    line4    3    3    2014-06-01    18    30    70
3    RFTA967    line1    line2    line3    line4    6    3    2014-06-02    51    18    9
3    RFTA967    line1    line2    line3    line4    null null 2014-06-03    null  null  null
3    RFTA967    line1    line2    line3    line4    9    3    2014-06-04    5     7     29

और ऐसा करने के लिए मुझे थोड़ा काम मिल गया ... लेकिन मैं इस गतिशील क्वेरी को करने के लिए बर्दाश्त नहीं कर सकता

SELECT * FROM (
SELECT
convert(date, "20140601", 120) as the_date
l.*, de.*
FROM
location l
LEFT OUTER JOIN
daily_exclusion de
ON (
de.location_id = l.location_id
AND
de.exclusion_date = "20140601" --HERE"S THE DIFFERENCE
)
WHERE
vl.location_id IN (1,2,3)
UNION ALL --CAN"T AFFORD TO DO THIS
SELECT
convert(date, "20140602", 120) as the_date
l.*, de.*
FROM
location l
LEFT OUTER JOIN
daily_exclusion de
ON (
de.location_id = l.location_id
AND
de.exclusion_date = "20140602" --HERE"S THE DIFFERENCE
)
WHERE
vl.location_id IN (1,2,3)
UNION ALL --CAN"T AFFORD TO DO THIS
SELECT
convert(date, "20140603", 120) as the_date
l.*, de.*
FROM
location l
LEFT OUTER JOIN
daily_exclusion de
ON (
de.location_id = l.location_id
AND
de.exclusion_date = "20140603" --HERE"S THE DIFFERENCE
)
WHERE
vl.location_id IN (1,2,3)
)
as t
ORDER BY the_date asc

और इसी तरह... यह पसंद है तालिका में शामिल होने पर एसक्यूएल में रिटर्निंग एनयूएलएल उस तारीख के लिए रिकॉर्ड्स गायब है लेकिन मेरे पास पंजीकृत तारीखों के साथ एक टेबल नहीं है

उत्तर:

उत्तर № 1 के लिए 1

आप ए का उपयोग करने पर विचार कर सकते हैं रिकर्सिव कॉमन टेबल एक्सप्रेशन (सीटीई) मानदंड तिथियों के बीच सभी तिथियों की एक सूची उत्पन्न करने के लिए।

उदा .:

WITH cteDates (ADate) AS
(
SELECT CAST("20140601" as date) as ADate

UNION ALL

SELECT DATEADD(day, 1, ADate)
FROM cteDates
WHERE DATEADD(day, 1, ADate) <= CAST("20140604" as date)
)

अपनी क्वेरी के सिर पर डालें और उपयोग करें cteDates एक और तालिका संदर्भ के रूप में, शायद एक में CROSS JOIN साथ में Location


संबंधित सवाल
सबसे लोकप्रिय