How to add a row with null data in final query?










0















I have got a table with data:



table1
country date price

USA 2001-01-25 2
RUS 2001-01-25 17
GER 2001-01-25 30
USA 2001-02-25 11
RUS 2001-02-25 22
RUS 2001-02-26 25


I can get all countries with



SELECT DISTINCT country FROM table1;

country
USA
RUS
GER


And get all prices for the month



SELECT sum(price), country FROM table1 WHERE date >= '2001-02-01' AND date < '2001-03-01' GROUP BY country, price;

sum(price) country
11 USA
47 RUS


But I also want to see one row for country 'GER'



sum(price) country
11 USA
47 RUS
0 GER


How to do it easy in clickhouse?










share|improve this question


























    0















    I have got a table with data:



    table1
    country date price

    USA 2001-01-25 2
    RUS 2001-01-25 17
    GER 2001-01-25 30
    USA 2001-02-25 11
    RUS 2001-02-25 22
    RUS 2001-02-26 25


    I can get all countries with



    SELECT DISTINCT country FROM table1;

    country
    USA
    RUS
    GER


    And get all prices for the month



    SELECT sum(price), country FROM table1 WHERE date >= '2001-02-01' AND date < '2001-03-01' GROUP BY country, price;

    sum(price) country
    11 USA
    47 RUS


    But I also want to see one row for country 'GER'



    sum(price) country
    11 USA
    47 RUS
    0 GER


    How to do it easy in clickhouse?










    share|improve this question
























      0












      0








      0








      I have got a table with data:



      table1
      country date price

      USA 2001-01-25 2
      RUS 2001-01-25 17
      GER 2001-01-25 30
      USA 2001-02-25 11
      RUS 2001-02-25 22
      RUS 2001-02-26 25


      I can get all countries with



      SELECT DISTINCT country FROM table1;

      country
      USA
      RUS
      GER


      And get all prices for the month



      SELECT sum(price), country FROM table1 WHERE date >= '2001-02-01' AND date < '2001-03-01' GROUP BY country, price;

      sum(price) country
      11 USA
      47 RUS


      But I also want to see one row for country 'GER'



      sum(price) country
      11 USA
      47 RUS
      0 GER


      How to do it easy in clickhouse?










      share|improve this question














      I have got a table with data:



      table1
      country date price

      USA 2001-01-25 2
      RUS 2001-01-25 17
      GER 2001-01-25 30
      USA 2001-02-25 11
      RUS 2001-02-25 22
      RUS 2001-02-26 25


      I can get all countries with



      SELECT DISTINCT country FROM table1;

      country
      USA
      RUS
      GER


      And get all prices for the month



      SELECT sum(price), country FROM table1 WHERE date >= '2001-02-01' AND date < '2001-03-01' GROUP BY country, price;

      sum(price) country
      11 USA
      47 RUS


      But I also want to see one row for country 'GER'



      sum(price) country
      11 USA
      47 RUS
      0 GER


      How to do it easy in clickhouse?







      clickhouse






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 14 '18 at 10:39









      JensJens

      1069




      1069






















          1 Answer
          1






          active

          oldest

          votes


















          1














          Use conditional aggregation:



          SELECT
          country,
          SUM(CASE WHEN date >= '2001-02-01' AND date < '2001-03-01'
          THEN price ELSE 0 END) AS prices
          FROM table1
          GROUP BY country;


          The problem with your current WHERE clause is that it will filter off countries which have no matching price at all during the month of February, 2001.



          If the above solution be not performant, we can writing this as a join of a table containing all countries to table1:



          SELECT c.country, COALESCE(t.prices, 0) AS prices
          FROM (SELECT DISTINCT country FROM table1) c
          LEFT JOIN
          (
          SELECT country, SUM(prices) AS prices
          FROM table1
          WHERE date >= '2001-02-01' AND date < '2001-03-01'
          GROUP BY country
          ) t
          ON c.country = t.country;





          share|improve this answer

























          • It doesn't return row with 0

            – Jens
            Nov 14 '18 at 12:30











          • @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

            – Tim Biegeleisen
            Nov 14 '18 at 13:27











          • It works with NULL instead of 0. Thank you!

            – Jens
            Nov 14 '18 at 14:27











          • This has the potential to be quite expensive withing large datasets when partitioning by date.

            – ecyshor
            Nov 14 '18 at 18:12












          • @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

            – Tim Biegeleisen
            Nov 14 '18 at 23:56










          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%2f53298247%2fhow-to-add-a-row-with-null-data-in-final-query%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          Use conditional aggregation:



          SELECT
          country,
          SUM(CASE WHEN date >= '2001-02-01' AND date < '2001-03-01'
          THEN price ELSE 0 END) AS prices
          FROM table1
          GROUP BY country;


          The problem with your current WHERE clause is that it will filter off countries which have no matching price at all during the month of February, 2001.



          If the above solution be not performant, we can writing this as a join of a table containing all countries to table1:



          SELECT c.country, COALESCE(t.prices, 0) AS prices
          FROM (SELECT DISTINCT country FROM table1) c
          LEFT JOIN
          (
          SELECT country, SUM(prices) AS prices
          FROM table1
          WHERE date >= '2001-02-01' AND date < '2001-03-01'
          GROUP BY country
          ) t
          ON c.country = t.country;





          share|improve this answer

























          • It doesn't return row with 0

            – Jens
            Nov 14 '18 at 12:30











          • @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

            – Tim Biegeleisen
            Nov 14 '18 at 13:27











          • It works with NULL instead of 0. Thank you!

            – Jens
            Nov 14 '18 at 14:27











          • This has the potential to be quite expensive withing large datasets when partitioning by date.

            – ecyshor
            Nov 14 '18 at 18:12












          • @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

            – Tim Biegeleisen
            Nov 14 '18 at 23:56















          1














          Use conditional aggregation:



          SELECT
          country,
          SUM(CASE WHEN date >= '2001-02-01' AND date < '2001-03-01'
          THEN price ELSE 0 END) AS prices
          FROM table1
          GROUP BY country;


          The problem with your current WHERE clause is that it will filter off countries which have no matching price at all during the month of February, 2001.



          If the above solution be not performant, we can writing this as a join of a table containing all countries to table1:



          SELECT c.country, COALESCE(t.prices, 0) AS prices
          FROM (SELECT DISTINCT country FROM table1) c
          LEFT JOIN
          (
          SELECT country, SUM(prices) AS prices
          FROM table1
          WHERE date >= '2001-02-01' AND date < '2001-03-01'
          GROUP BY country
          ) t
          ON c.country = t.country;





          share|improve this answer

























          • It doesn't return row with 0

            – Jens
            Nov 14 '18 at 12:30











          • @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

            – Tim Biegeleisen
            Nov 14 '18 at 13:27











          • It works with NULL instead of 0. Thank you!

            – Jens
            Nov 14 '18 at 14:27











          • This has the potential to be quite expensive withing large datasets when partitioning by date.

            – ecyshor
            Nov 14 '18 at 18:12












          • @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

            – Tim Biegeleisen
            Nov 14 '18 at 23:56













          1












          1








          1







          Use conditional aggregation:



          SELECT
          country,
          SUM(CASE WHEN date >= '2001-02-01' AND date < '2001-03-01'
          THEN price ELSE 0 END) AS prices
          FROM table1
          GROUP BY country;


          The problem with your current WHERE clause is that it will filter off countries which have no matching price at all during the month of February, 2001.



          If the above solution be not performant, we can writing this as a join of a table containing all countries to table1:



          SELECT c.country, COALESCE(t.prices, 0) AS prices
          FROM (SELECT DISTINCT country FROM table1) c
          LEFT JOIN
          (
          SELECT country, SUM(prices) AS prices
          FROM table1
          WHERE date >= '2001-02-01' AND date < '2001-03-01'
          GROUP BY country
          ) t
          ON c.country = t.country;





          share|improve this answer















          Use conditional aggregation:



          SELECT
          country,
          SUM(CASE WHEN date >= '2001-02-01' AND date < '2001-03-01'
          THEN price ELSE 0 END) AS prices
          FROM table1
          GROUP BY country;


          The problem with your current WHERE clause is that it will filter off countries which have no matching price at all during the month of February, 2001.



          If the above solution be not performant, we can writing this as a join of a table containing all countries to table1:



          SELECT c.country, COALESCE(t.prices, 0) AS prices
          FROM (SELECT DISTINCT country FROM table1) c
          LEFT JOIN
          (
          SELECT country, SUM(prices) AS prices
          FROM table1
          WHERE date >= '2001-02-01' AND date < '2001-03-01'
          GROUP BY country
          ) t
          ON c.country = t.country;






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 15 '18 at 0:02

























          answered Nov 14 '18 at 10:42









          Tim BiegeleisenTim Biegeleisen

          223k1391143




          223k1391143












          • It doesn't return row with 0

            – Jens
            Nov 14 '18 at 12:30











          • @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

            – Tim Biegeleisen
            Nov 14 '18 at 13:27











          • It works with NULL instead of 0. Thank you!

            – Jens
            Nov 14 '18 at 14:27











          • This has the potential to be quite expensive withing large datasets when partitioning by date.

            – ecyshor
            Nov 14 '18 at 18:12












          • @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

            – Tim Biegeleisen
            Nov 14 '18 at 23:56

















          • It doesn't return row with 0

            – Jens
            Nov 14 '18 at 12:30











          • @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

            – Tim Biegeleisen
            Nov 14 '18 at 13:27











          • It works with NULL instead of 0. Thank you!

            – Jens
            Nov 14 '18 at 14:27











          • This has the potential to be quite expensive withing large datasets when partitioning by date.

            – ecyshor
            Nov 14 '18 at 18:12












          • @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

            – Tim Biegeleisen
            Nov 14 '18 at 23:56
















          It doesn't return row with 0

          – Jens
          Nov 14 '18 at 12:30





          It doesn't return row with 0

          – Jens
          Nov 14 '18 at 12:30













          @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

          – Tim Biegeleisen
          Nov 14 '18 at 13:27





          @Jens I don't know much about Clickhouse SQL, but my answer is definitely working with your sample data on SQL Server. See the demo here.

          – Tim Biegeleisen
          Nov 14 '18 at 13:27













          It works with NULL instead of 0. Thank you!

          – Jens
          Nov 14 '18 at 14:27





          It works with NULL instead of 0. Thank you!

          – Jens
          Nov 14 '18 at 14:27













          This has the potential to be quite expensive withing large datasets when partitioning by date.

          – ecyshor
          Nov 14 '18 at 18:12






          This has the potential to be quite expensive withing large datasets when partitioning by date.

          – ecyshor
          Nov 14 '18 at 18:12














          @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

          – Tim Biegeleisen
          Nov 14 '18 at 23:56





          @ecyshor I updated my answer with a join option which might run faster. But it is not clear whether the OP actually has a dedicated table of country names.

          – Tim Biegeleisen
          Nov 14 '18 at 23:56

















          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%2f53298247%2fhow-to-add-a-row-with-null-data-in-final-query%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

          27

          Top Tejano songwriter Luis Silva dead of heart attack at 64

          Category:Rhetoric