SQL Server - complete results with non existent data












0















I have a table where I have all the customers and a table where I have all their restrictions.



CUSTOMER

customer_id customer_name
1 name 1
2 name 2

CUSTOMER_RESTRICTIONS

rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 13:00 17:00 1
TYPE2 0 17:00 23:59 1


Problem: I only have a record for a restriction type and a customer when the customer has a restriction and this is a problem in the visualization I want to build.



I need every customer, every day and every restriction type, even when there is no restriction. In that case hour_start and hour_stop would be NULL.



For the tables shown, the output would be



rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 08:00 12:00 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE1 6 NULL NULL 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE2 0 NULL NULL 1
TYPE2 1 NULL NULL 1
TYPE2 2 NULL NULL 1
TYPE2 3 NULL NULL 1
TYPE2 4 NULL NULL 1
TYPE2 5 NULL NULL 1
TYPE2 6 NULL NULL 1
TYPE1 0 NULL NULL 2
TYPE1 1 NULL NULL 2
TYPE1 2 NULL NULL 2
TYPE1 3 NULL NULL 2
TYPE1 4 NULL NULL 2
TYPE1 5 NULL NULL 2
TYPE1 6 NULL NULL 2
TYPE2 0 NULL NULL 2
TYPE2 1 NULL NULL 2
TYPE2 2 NULL NULL 2
TYPE2 3 NULL NULL 2
TYPE2 4 NULL NULL 2
TYPE2 5 NULL NULL 2
TYPE2 6 NULL NULL 2


How can I achieve that? I couldn't even start to build this query.










share|improve this question




















  • 1





    Can we assume that you have a customer table as well where your customer_id's are stored?

    – squillman
    Nov 21 '18 at 18:17






  • 1





    I can't understand what you want to do there, could you please post a desired results? it would be great.

    – Sami
    Nov 21 '18 at 18:18











  • Also I don't see day_of_week 1 there, your question is not clear, please edit it

    – Sami
    Nov 21 '18 at 18:24











  • I'll update it.

    – Frias
    Nov 21 '18 at 18:27
















0















I have a table where I have all the customers and a table where I have all their restrictions.



CUSTOMER

customer_id customer_name
1 name 1
2 name 2

CUSTOMER_RESTRICTIONS

rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 13:00 17:00 1
TYPE2 0 17:00 23:59 1


Problem: I only have a record for a restriction type and a customer when the customer has a restriction and this is a problem in the visualization I want to build.



I need every customer, every day and every restriction type, even when there is no restriction. In that case hour_start and hour_stop would be NULL.



For the tables shown, the output would be



rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 08:00 12:00 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE1 6 NULL NULL 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE2 0 NULL NULL 1
TYPE2 1 NULL NULL 1
TYPE2 2 NULL NULL 1
TYPE2 3 NULL NULL 1
TYPE2 4 NULL NULL 1
TYPE2 5 NULL NULL 1
TYPE2 6 NULL NULL 1
TYPE1 0 NULL NULL 2
TYPE1 1 NULL NULL 2
TYPE1 2 NULL NULL 2
TYPE1 3 NULL NULL 2
TYPE1 4 NULL NULL 2
TYPE1 5 NULL NULL 2
TYPE1 6 NULL NULL 2
TYPE2 0 NULL NULL 2
TYPE2 1 NULL NULL 2
TYPE2 2 NULL NULL 2
TYPE2 3 NULL NULL 2
TYPE2 4 NULL NULL 2
TYPE2 5 NULL NULL 2
TYPE2 6 NULL NULL 2


How can I achieve that? I couldn't even start to build this query.










share|improve this question




















  • 1





    Can we assume that you have a customer table as well where your customer_id's are stored?

    – squillman
    Nov 21 '18 at 18:17






  • 1





    I can't understand what you want to do there, could you please post a desired results? it would be great.

    – Sami
    Nov 21 '18 at 18:18











  • Also I don't see day_of_week 1 there, your question is not clear, please edit it

    – Sami
    Nov 21 '18 at 18:24











  • I'll update it.

    – Frias
    Nov 21 '18 at 18:27














0












0








0








I have a table where I have all the customers and a table where I have all their restrictions.



CUSTOMER

customer_id customer_name
1 name 1
2 name 2

CUSTOMER_RESTRICTIONS

rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 13:00 17:00 1
TYPE2 0 17:00 23:59 1


Problem: I only have a record for a restriction type and a customer when the customer has a restriction and this is a problem in the visualization I want to build.



I need every customer, every day and every restriction type, even when there is no restriction. In that case hour_start and hour_stop would be NULL.



For the tables shown, the output would be



rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 08:00 12:00 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE1 6 NULL NULL 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE2 0 NULL NULL 1
TYPE2 1 NULL NULL 1
TYPE2 2 NULL NULL 1
TYPE2 3 NULL NULL 1
TYPE2 4 NULL NULL 1
TYPE2 5 NULL NULL 1
TYPE2 6 NULL NULL 1
TYPE1 0 NULL NULL 2
TYPE1 1 NULL NULL 2
TYPE1 2 NULL NULL 2
TYPE1 3 NULL NULL 2
TYPE1 4 NULL NULL 2
TYPE1 5 NULL NULL 2
TYPE1 6 NULL NULL 2
TYPE2 0 NULL NULL 2
TYPE2 1 NULL NULL 2
TYPE2 2 NULL NULL 2
TYPE2 3 NULL NULL 2
TYPE2 4 NULL NULL 2
TYPE2 5 NULL NULL 2
TYPE2 6 NULL NULL 2


How can I achieve that? I couldn't even start to build this query.










share|improve this question
















I have a table where I have all the customers and a table where I have all their restrictions.



CUSTOMER

customer_id customer_name
1 name 1
2 name 2

CUSTOMER_RESTRICTIONS

rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 13:00 17:00 1
TYPE2 0 17:00 23:59 1


Problem: I only have a record for a restriction type and a customer when the customer has a restriction and this is a problem in the visualization I want to build.



I need every customer, every day and every restriction type, even when there is no restriction. In that case hour_start and hour_stop would be NULL.



For the tables shown, the output would be



rest_type day_of_week hour_start hour_stop customer_id

TYPE1 0 08:00 12:00 1
TYPE1 0 08:00 12:00 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE1 6 NULL NULL 1
TYPE1 1 NULL NULL 1
TYPE1 2 NULL NULL 1
TYPE1 3 NULL NULL 1
TYPE1 4 NULL NULL 1
TYPE1 5 NULL NULL 1
TYPE2 0 NULL NULL 1
TYPE2 1 NULL NULL 1
TYPE2 2 NULL NULL 1
TYPE2 3 NULL NULL 1
TYPE2 4 NULL NULL 1
TYPE2 5 NULL NULL 1
TYPE2 6 NULL NULL 1
TYPE1 0 NULL NULL 2
TYPE1 1 NULL NULL 2
TYPE1 2 NULL NULL 2
TYPE1 3 NULL NULL 2
TYPE1 4 NULL NULL 2
TYPE1 5 NULL NULL 2
TYPE1 6 NULL NULL 2
TYPE2 0 NULL NULL 2
TYPE2 1 NULL NULL 2
TYPE2 2 NULL NULL 2
TYPE2 3 NULL NULL 2
TYPE2 4 NULL NULL 2
TYPE2 5 NULL NULL 2
TYPE2 6 NULL NULL 2


How can I achieve that? I couldn't even start to build this query.







sql sql-server






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 '18 at 18:32







Frias

















asked Nov 21 '18 at 18:15









FriasFrias

3,70482635




3,70482635








  • 1





    Can we assume that you have a customer table as well where your customer_id's are stored?

    – squillman
    Nov 21 '18 at 18:17






  • 1





    I can't understand what you want to do there, could you please post a desired results? it would be great.

    – Sami
    Nov 21 '18 at 18:18











  • Also I don't see day_of_week 1 there, your question is not clear, please edit it

    – Sami
    Nov 21 '18 at 18:24











  • I'll update it.

    – Frias
    Nov 21 '18 at 18:27














  • 1





    Can we assume that you have a customer table as well where your customer_id's are stored?

    – squillman
    Nov 21 '18 at 18:17






  • 1





    I can't understand what you want to do there, could you please post a desired results? it would be great.

    – Sami
    Nov 21 '18 at 18:18











  • Also I don't see day_of_week 1 there, your question is not clear, please edit it

    – Sami
    Nov 21 '18 at 18:24











  • I'll update it.

    – Frias
    Nov 21 '18 at 18:27








1




1





Can we assume that you have a customer table as well where your customer_id's are stored?

– squillman
Nov 21 '18 at 18:17





Can we assume that you have a customer table as well where your customer_id's are stored?

– squillman
Nov 21 '18 at 18:17




1




1





I can't understand what you want to do there, could you please post a desired results? it would be great.

– Sami
Nov 21 '18 at 18:18





I can't understand what you want to do there, could you please post a desired results? it would be great.

– Sami
Nov 21 '18 at 18:18













Also I don't see day_of_week 1 there, your question is not clear, please edit it

– Sami
Nov 21 '18 at 18:24





Also I don't see day_of_week 1 there, your question is not clear, please edit it

– Sami
Nov 21 '18 at 18:24













I'll update it.

– Frias
Nov 21 '18 at 18:27





I'll update it.

– Frias
Nov 21 '18 at 18:27












3 Answers
3






active

oldest

votes


















1














Essentially you need to start with the data you must have and left join the optional data. E.g., something like this:



select c.customer_id
,r.[rest_type]
,d.[day_of_week]
,r.[hour_start]
,r.[hour_stop]
from CUSTOMER c
cross apply (
select 0 as day_of_week
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
) d
left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id and d.day_of_week = r.day_of_week


Output:



customer_id rest_type day_of_week hour_start hour_stop
----------- --------- ----------- ---------- ---------
1 TYPE1 0 08:00 12:00
1 TYPE1 0 13:00 17:00
1 TYPE2 0 17:00 23:59
1 NULL 1 NULL NULL
1 NULL 2 NULL NULL
1 NULL 3 NULL NULL
1 NULL 4 NULL NULL
1 NULL 5 NULL NULL
1 NULL 6 NULL NULL


If there are only type rest_types, you don't have a lookup table for them, and you want to show a row for each, you would do:



select c.customer_id
,t.[rest_type]
,d.[day_of_week]
,r.[hour_start]
,r.[hour_stop]
from CUSTOMER c
cross apply (
select 0 as day_of_week
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
) d
cross apply (
select 'TYPE1' as rest_type
union all select 'TYPE2'
) t
left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id
and d.day_of_week = r.day_of_week
and t.rest_type = r.rest_type





share|improve this answer


























  • Only The Beatles have 8 days a week :)

    – Dave Cullum
    Nov 21 '18 at 18:36











  • @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

    – RedFilter
    Nov 21 '18 at 18:38





















0














  (select rest_type, day_of_week,
hour_start ,
hour_stop
from table A
where rest_type IS NOT NULL)
Union
(select rest_type,
day_of_week,
NULL ,NULL
from table A
where rest_type IS NULL)



Is this what you want ?







share|improve this answer































    0














    First off, I wouldn't store rest type as you are, that is a bad habit, it should be a reference table!



    You need to cross apply to get all your possible combinations, and then add in the values you DO have...



    DECLARE @Customer TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
    DECLARE @Rest TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
    DECLARE @Restrictions TABLE (Id INT IDENTITY(1,1), RestID INT, CustomerID INT, Day_of_Week TINYINT, hour_start TIME, hour_end TIME)

    INSERT INTO @Customer (NAME)
    VALUES('JOHN'),('SUSAN')

    INSERT INTO @Rest (NAME)
    VALUES ('TYPE A'),('TYPE B')

    INSERT INTO @Restrictions (RestID,CustomerID,Day_of_Week,hour_start,hour_end)
    VALUES (1,1,0,'08:00','12:00'),
    (1,1,0,'13:00','17:00'),
    (1,2,0,'17:00','23:59')

    ;WITH DaysofWeek AS
    (
    SELECT 0 AS dow
    UNION ALL
    SELECT dow+1
    FROM DaysofWeek
    WHERE dow<5
    )

    SELECT *
    FROM @Customer C
    CROSS APPLY @Rest R
    CROSS APPLY DaysofWeek D
    LEFT JOIN @Restrictions X
    ON X.Day_of_Week=D.dow
    AND X.CustomerID=C.Id
    AND X.RestID=R.Id
    ORDER BY C.Id, D.dow, R.Id





    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53418263%2fsql-server-complete-results-with-non-existent-data%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      Essentially you need to start with the data you must have and left join the optional data. E.g., something like this:



      select c.customer_id
      ,r.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id and d.day_of_week = r.day_of_week


      Output:



      customer_id rest_type day_of_week hour_start hour_stop
      ----------- --------- ----------- ---------- ---------
      1 TYPE1 0 08:00 12:00
      1 TYPE1 0 13:00 17:00
      1 TYPE2 0 17:00 23:59
      1 NULL 1 NULL NULL
      1 NULL 2 NULL NULL
      1 NULL 3 NULL NULL
      1 NULL 4 NULL NULL
      1 NULL 5 NULL NULL
      1 NULL 6 NULL NULL


      If there are only type rest_types, you don't have a lookup table for them, and you want to show a row for each, you would do:



      select c.customer_id
      ,t.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      cross apply (
      select 'TYPE1' as rest_type
      union all select 'TYPE2'
      ) t
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id
      and d.day_of_week = r.day_of_week
      and t.rest_type = r.rest_type





      share|improve this answer


























      • Only The Beatles have 8 days a week :)

        – Dave Cullum
        Nov 21 '18 at 18:36











      • @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

        – RedFilter
        Nov 21 '18 at 18:38


















      1














      Essentially you need to start with the data you must have and left join the optional data. E.g., something like this:



      select c.customer_id
      ,r.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id and d.day_of_week = r.day_of_week


      Output:



      customer_id rest_type day_of_week hour_start hour_stop
      ----------- --------- ----------- ---------- ---------
      1 TYPE1 0 08:00 12:00
      1 TYPE1 0 13:00 17:00
      1 TYPE2 0 17:00 23:59
      1 NULL 1 NULL NULL
      1 NULL 2 NULL NULL
      1 NULL 3 NULL NULL
      1 NULL 4 NULL NULL
      1 NULL 5 NULL NULL
      1 NULL 6 NULL NULL


      If there are only type rest_types, you don't have a lookup table for them, and you want to show a row for each, you would do:



      select c.customer_id
      ,t.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      cross apply (
      select 'TYPE1' as rest_type
      union all select 'TYPE2'
      ) t
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id
      and d.day_of_week = r.day_of_week
      and t.rest_type = r.rest_type





      share|improve this answer


























      • Only The Beatles have 8 days a week :)

        – Dave Cullum
        Nov 21 '18 at 18:36











      • @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

        – RedFilter
        Nov 21 '18 at 18:38
















      1












      1








      1







      Essentially you need to start with the data you must have and left join the optional data. E.g., something like this:



      select c.customer_id
      ,r.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id and d.day_of_week = r.day_of_week


      Output:



      customer_id rest_type day_of_week hour_start hour_stop
      ----------- --------- ----------- ---------- ---------
      1 TYPE1 0 08:00 12:00
      1 TYPE1 0 13:00 17:00
      1 TYPE2 0 17:00 23:59
      1 NULL 1 NULL NULL
      1 NULL 2 NULL NULL
      1 NULL 3 NULL NULL
      1 NULL 4 NULL NULL
      1 NULL 5 NULL NULL
      1 NULL 6 NULL NULL


      If there are only type rest_types, you don't have a lookup table for them, and you want to show a row for each, you would do:



      select c.customer_id
      ,t.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      cross apply (
      select 'TYPE1' as rest_type
      union all select 'TYPE2'
      ) t
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id
      and d.day_of_week = r.day_of_week
      and t.rest_type = r.rest_type





      share|improve this answer















      Essentially you need to start with the data you must have and left join the optional data. E.g., something like this:



      select c.customer_id
      ,r.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id and d.day_of_week = r.day_of_week


      Output:



      customer_id rest_type day_of_week hour_start hour_stop
      ----------- --------- ----------- ---------- ---------
      1 TYPE1 0 08:00 12:00
      1 TYPE1 0 13:00 17:00
      1 TYPE2 0 17:00 23:59
      1 NULL 1 NULL NULL
      1 NULL 2 NULL NULL
      1 NULL 3 NULL NULL
      1 NULL 4 NULL NULL
      1 NULL 5 NULL NULL
      1 NULL 6 NULL NULL


      If there are only type rest_types, you don't have a lookup table for them, and you want to show a row for each, you would do:



      select c.customer_id
      ,t.[rest_type]
      ,d.[day_of_week]
      ,r.[hour_start]
      ,r.[hour_stop]
      from CUSTOMER c
      cross apply (
      select 0 as day_of_week
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      ) d
      cross apply (
      select 'TYPE1' as rest_type
      union all select 'TYPE2'
      ) t
      left join CUSTOMER_RESTRICTIONS r on c.customer_id = r.customer_id
      and d.day_of_week = r.day_of_week
      and t.rest_type = r.rest_type






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 21 '18 at 18:41

























      answered Nov 21 '18 at 18:32









      RedFilterRedFilter

      134k30242253




      134k30242253













      • Only The Beatles have 8 days a week :)

        – Dave Cullum
        Nov 21 '18 at 18:36











      • @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

        – RedFilter
        Nov 21 '18 at 18:38





















      • Only The Beatles have 8 days a week :)

        – Dave Cullum
        Nov 21 '18 at 18:36











      • @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

        – RedFilter
        Nov 21 '18 at 18:38



















      Only The Beatles have 8 days a week :)

      – Dave Cullum
      Nov 21 '18 at 18:36





      Only The Beatles have 8 days a week :)

      – Dave Cullum
      Nov 21 '18 at 18:36













      @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

      – RedFilter
      Nov 21 '18 at 18:38







      @DaveCullum I had to allow for 0 representing no data, since no other values were present initially.

      – RedFilter
      Nov 21 '18 at 18:38















      0














        (select rest_type, day_of_week,
      hour_start ,
      hour_stop
      from table A
      where rest_type IS NOT NULL)
      Union
      (select rest_type,
      day_of_week,
      NULL ,NULL
      from table A
      where rest_type IS NULL)



      Is this what you want ?







      share|improve this answer




























        0














          (select rest_type, day_of_week,
        hour_start ,
        hour_stop
        from table A
        where rest_type IS NOT NULL)
        Union
        (select rest_type,
        day_of_week,
        NULL ,NULL
        from table A
        where rest_type IS NULL)



        Is this what you want ?







        share|improve this answer


























          0












          0








          0







            (select rest_type, day_of_week,
          hour_start ,
          hour_stop
          from table A
          where rest_type IS NOT NULL)
          Union
          (select rest_type,
          day_of_week,
          NULL ,NULL
          from table A
          where rest_type IS NULL)



          Is this what you want ?







          share|improve this answer













            (select rest_type, day_of_week,
          hour_start ,
          hour_stop
          from table A
          where rest_type IS NOT NULL)
          Union
          (select rest_type,
          day_of_week,
          NULL ,NULL
          from table A
          where rest_type IS NULL)



          Is this what you want ?








          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 21 '18 at 18:28









          Himanshu AhujaHimanshu Ahuja

          6561216




          6561216























              0














              First off, I wouldn't store rest type as you are, that is a bad habit, it should be a reference table!



              You need to cross apply to get all your possible combinations, and then add in the values you DO have...



              DECLARE @Customer TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
              DECLARE @Rest TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
              DECLARE @Restrictions TABLE (Id INT IDENTITY(1,1), RestID INT, CustomerID INT, Day_of_Week TINYINT, hour_start TIME, hour_end TIME)

              INSERT INTO @Customer (NAME)
              VALUES('JOHN'),('SUSAN')

              INSERT INTO @Rest (NAME)
              VALUES ('TYPE A'),('TYPE B')

              INSERT INTO @Restrictions (RestID,CustomerID,Day_of_Week,hour_start,hour_end)
              VALUES (1,1,0,'08:00','12:00'),
              (1,1,0,'13:00','17:00'),
              (1,2,0,'17:00','23:59')

              ;WITH DaysofWeek AS
              (
              SELECT 0 AS dow
              UNION ALL
              SELECT dow+1
              FROM DaysofWeek
              WHERE dow<5
              )

              SELECT *
              FROM @Customer C
              CROSS APPLY @Rest R
              CROSS APPLY DaysofWeek D
              LEFT JOIN @Restrictions X
              ON X.Day_of_Week=D.dow
              AND X.CustomerID=C.Id
              AND X.RestID=R.Id
              ORDER BY C.Id, D.dow, R.Id





              share|improve this answer




























                0














                First off, I wouldn't store rest type as you are, that is a bad habit, it should be a reference table!



                You need to cross apply to get all your possible combinations, and then add in the values you DO have...



                DECLARE @Customer TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                DECLARE @Rest TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                DECLARE @Restrictions TABLE (Id INT IDENTITY(1,1), RestID INT, CustomerID INT, Day_of_Week TINYINT, hour_start TIME, hour_end TIME)

                INSERT INTO @Customer (NAME)
                VALUES('JOHN'),('SUSAN')

                INSERT INTO @Rest (NAME)
                VALUES ('TYPE A'),('TYPE B')

                INSERT INTO @Restrictions (RestID,CustomerID,Day_of_Week,hour_start,hour_end)
                VALUES (1,1,0,'08:00','12:00'),
                (1,1,0,'13:00','17:00'),
                (1,2,0,'17:00','23:59')

                ;WITH DaysofWeek AS
                (
                SELECT 0 AS dow
                UNION ALL
                SELECT dow+1
                FROM DaysofWeek
                WHERE dow<5
                )

                SELECT *
                FROM @Customer C
                CROSS APPLY @Rest R
                CROSS APPLY DaysofWeek D
                LEFT JOIN @Restrictions X
                ON X.Day_of_Week=D.dow
                AND X.CustomerID=C.Id
                AND X.RestID=R.Id
                ORDER BY C.Id, D.dow, R.Id





                share|improve this answer


























                  0












                  0








                  0







                  First off, I wouldn't store rest type as you are, that is a bad habit, it should be a reference table!



                  You need to cross apply to get all your possible combinations, and then add in the values you DO have...



                  DECLARE @Customer TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                  DECLARE @Rest TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                  DECLARE @Restrictions TABLE (Id INT IDENTITY(1,1), RestID INT, CustomerID INT, Day_of_Week TINYINT, hour_start TIME, hour_end TIME)

                  INSERT INTO @Customer (NAME)
                  VALUES('JOHN'),('SUSAN')

                  INSERT INTO @Rest (NAME)
                  VALUES ('TYPE A'),('TYPE B')

                  INSERT INTO @Restrictions (RestID,CustomerID,Day_of_Week,hour_start,hour_end)
                  VALUES (1,1,0,'08:00','12:00'),
                  (1,1,0,'13:00','17:00'),
                  (1,2,0,'17:00','23:59')

                  ;WITH DaysofWeek AS
                  (
                  SELECT 0 AS dow
                  UNION ALL
                  SELECT dow+1
                  FROM DaysofWeek
                  WHERE dow<5
                  )

                  SELECT *
                  FROM @Customer C
                  CROSS APPLY @Rest R
                  CROSS APPLY DaysofWeek D
                  LEFT JOIN @Restrictions X
                  ON X.Day_of_Week=D.dow
                  AND X.CustomerID=C.Id
                  AND X.RestID=R.Id
                  ORDER BY C.Id, D.dow, R.Id





                  share|improve this answer













                  First off, I wouldn't store rest type as you are, that is a bad habit, it should be a reference table!



                  You need to cross apply to get all your possible combinations, and then add in the values you DO have...



                  DECLARE @Customer TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                  DECLARE @Rest TABLE (Id INT IDENTITY(1,1), Name NVARCHAR(100))
                  DECLARE @Restrictions TABLE (Id INT IDENTITY(1,1), RestID INT, CustomerID INT, Day_of_Week TINYINT, hour_start TIME, hour_end TIME)

                  INSERT INTO @Customer (NAME)
                  VALUES('JOHN'),('SUSAN')

                  INSERT INTO @Rest (NAME)
                  VALUES ('TYPE A'),('TYPE B')

                  INSERT INTO @Restrictions (RestID,CustomerID,Day_of_Week,hour_start,hour_end)
                  VALUES (1,1,0,'08:00','12:00'),
                  (1,1,0,'13:00','17:00'),
                  (1,2,0,'17:00','23:59')

                  ;WITH DaysofWeek AS
                  (
                  SELECT 0 AS dow
                  UNION ALL
                  SELECT dow+1
                  FROM DaysofWeek
                  WHERE dow<5
                  )

                  SELECT *
                  FROM @Customer C
                  CROSS APPLY @Rest R
                  CROSS APPLY DaysofWeek D
                  LEFT JOIN @Restrictions X
                  ON X.Day_of_Week=D.dow
                  AND X.CustomerID=C.Id
                  AND X.RestID=R.Id
                  ORDER BY C.Id, D.dow, R.Id






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 21 '18 at 18:34









                  Dave CullumDave Cullum

                  6,10411229




                  6,10411229






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53418263%2fsql-server-complete-results-with-non-existent-data%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Costa Masnaga

                      Fotorealismo

                      Sidney Franklin