Как вставить данные из 4 запросов в одну таблицу, если 4 запроса имеют данные, которые не являются уникальными? - PullRequest
0 голосов
/ 14 мая 2019

, чтобы быть более понятным, у меня есть такие данные.

Запрос 1) Данные за 2016 год

Item       Price        Quantity

Shoe        20             10
Shoe        30             15
Cups        10             30
Towels      30             20
Towels      25             20
Towels      20             20

Запрос 2) Данные за 2017 год

Item       Price        Quantity

Shoe        40             30
Shoe        50             20
Towels      30             30
Towels      20             30

Запрос 3) Данные за 2018

Item       Price        Quantity

Shoe        20             10
Cups        10             30
Towels      30             20
Towels      25             20
Towels      20             20

Запрос 1) Данные за 2019

Item       Price        Quantity

Shoe        20             10
Shoe        30             15
Cups        10             30
Towels      30             20
Towels      25             20
Towels      20             20

Я хотел бы получить такой результат:

Item   Price2016   Quantity2016   Price2017   Quantity2017  Price2018   Quantity2018   Price2019   Quantity2019

Shoe      20           10            40            30          20          10             20            10
Shoe      30           15            50            20                                     30            15

Iпопытался использовать Joins, Unions, даже создать Temp Tables или cursor

, например, inner Join дать такой результат:

Item       Price2016        Quantity 2016       Price2017        Quantity 2017 ...

Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10
Shoe          20                 10                20               10

Пожалуйста, обратите внимание, чтоданные в этом примере являются неточными, но результат похож на этот.

Любая идея, как получить предпочтительный результат, используя SQL

РЕДАКТИРОВАТЬ: запрос, из которого я получаю данныеэто

select Item, Price, sum(quantity) as quantity from Sales where year(itemsold) = 2016 group by Item, price

Я просто меняю год, чтобы получить другие данные.

Ответы [ 4 ]

1 голос
/ 14 мая 2019

J,

Я видел вышеупомянутое решение , и оно также действительно, но вы также можете попробовать использовать PIVOT .Я создал демо для вас, пожалуйста, проверьте это решение, которое также может помочь вам.

ДЕМО

ОБЪЯВИТЬ СТОЛЫ И ВСТАВИТЬ ЗАПИСИ

DECLARE @Table2016 AS TABLE ( Item VARCHAR(50), Price FLOAT, Quantity INT ); 
DECLARE @Table2017 AS TABLE ( Item VARCHAR(50), Price FLOAT, Quantity INT ); 
DECLARE @Table2018 AS TABLE ( Item VARCHAR(50), Price FLOAT, Quantity INT );
DECLARE @Table2019 AS TABLE ( Item VARCHAR(50), Price FLOAT, Quantity INT );

INSERT INTO @Table2016 (Item,Price,Quantity) VALUES
('Shoe'  ,20,10),
('Shoe'  ,30,15),
('Cups' ,10,30),
('Towels',30,20),
('Towels',25,20),
('Towels',20,20)

INSERT INTO @Table2017 (Item,Price,Quantity) VALUES
('Shoe'  ,40,30),
('Shoe'  ,50,20),
('Towels',30,30),
('Towels',20,30)

INSERT INTO @Table2018 (Item,Price,Quantity) VALUES
('Shoe'  ,20,10),
('Cups'  ,10,30),
('Towels',30,20),
('Towels',25,20),
('Towels',20,20)

INSERT INTO @Table2019 (Item,Price,Quantity) VALUES
('Shoe'  ,20,10),
('Shoe'  ,30,15),
('Cups'  ,10,30),
('Towels',30,20),
('Towels',25,20),
('Towels',20,20)

УДАЛИТЬ ВСЕ ТАБЛИЦЫ И ВСТАВИТЬ В ТАБЛИЦУ ТЕМП.

    SELECT Item,Price,Quantity,PriceYear,QuantityYear INTO TempFinal
    FROM (
    SELECT Item,Price,Quantity, 'Price2016' as PriceYear,'Quantity2016' as QuantityYear FROM @Table2016
    UNION ALL                                      
    SELECT Item,Price,Quantity, 'Price2017' as PriceYear,'Quantity2017' as QuantityYear FROM @Table2017
    UNION ALL                                      
    SELECT Item,Price,Quantity, 'Price2018' as PriceYear,'Quantity2018' as QuantityYear FROM @Table2018
    UNION ALL                                      
    SELECT Item,Price,Quantity, 'Price2019' as PriceYear,'Quantity2019' as QuantityYear FROM @Table2019
    ) MyTables

ЗАПРОС БЕЗ ГРУППЫ

    SELECT item, [Price2016],[Quantity2016],[Price2017],[Quantity2017],[Price2018],[Quantity2018],[Price2019],[Quantity2019]
    FROM (
    SELECT item,Price,Quantity,PriceYear,QuantityYear
    FROM TempFinal) up
    PIVOT (SUM(Quantity) FOR QuantityYear IN ([Quantity2016],[Quantity2017],[Quantity2018],[Quantity2019])) AS pvt
    PIVOT (SUM(Price) FOR PriceYear IN ([Price2016],[Price2017],[Price2018],[Price2019])) AS pvt2
    ORDER BY item

ЗАПРОС С GROUPBY

     SELECT item, SUM([Price2016])[Price2016],SUM([Quantity2016])[Quantity2016],SUM([Price2017])[Price2017],SUM([Quantity2017])[Quantity2017],SUM([Price2018])[Price2018],SUM([Quantity2018])[Quantity2018],SUM([Price2019])[Price2019],SUM([Quantity2019])[Quantity2019]
    FROM (
    SELECT item,Price,Quantity,PriceYear,QuantityYear
    FROM TempFinal) up
    PIVOT (SUM(Quantity) FOR QuantityYear IN ([Quantity2016],[Quantity2017],[Quantity2018],[Quantity2019])) AS pvt
    PIVOT (SUM(Price) FOR PriceYear IN ([Price2016],[Price2017],[Price2018],[Price2019])) AS pvt2
    GROUP by item
    ORDER BY item

ТАБЛИЦА СНИЖЕНИЯ ТЕМПЕРАТУРЫ

DROP TABLE TempFinal
1 голос
/ 14 мая 2019

Попробуйте использовать его, оно включает GROUP BY предметов и цены.

SELECT Item,
Price,
SUM(Quantity2016),
SUM(Quantity2017),
...
FROM
(
    --query 1:

    SELECT Item, 
    Price,
    Quantity AS Quantity2016,
    NULL AS Quantity2017  
    NULL AS Quantity2018   
    NULL AS Quantity2019
    FROM 2016

    UNION ALL

    --query 2:

    SELECT Item, 
    Price,
    NULL AS Quantity2016,
    Quantity AS Quantity2017  
    NULL AS Quantity2018   
    NULL AS Quantity2019
    FROM 2017

    UNION ALL

    --query 3:

    SELECT Item, 
    Price,
    NULL AS Quantity2016,
    NULL AS Quantity2017  
    Quantity AS Quantity2018   
    NULL AS Quantity2019
    FROM 2018

    UNION ALL
    ...

)A
GROUP BY Item, Price
1 голос
/ 14 мая 2019

Попробуйте это просто как идея-

SELECT Item,
SUM(Price2016),SUM(Quantity2016),
SUM(Price2017),SUM(Quantity2017),
SUM(Price2018),SUM(Quantity2018),
SUM(Price2019),SUM(Quantity2019)
FROM
(
    SELECT Item, 
    Price Price2016, Quantity  Quantity2016,
    NULL Price2017,NULL   Quantity2017  
    NULL Price2018,NULL   Quantity2018   
    NULL Price2019, NULL  Quantity2019
    FROM 2016

    UNION ALL

    SELECT Item, 
    NULL Price2016, NULL Quantity2016,
    Price Price2017,Quantity Quantity2017  
    NULL Price2018,NULL   Quantity2018   
    NULL Price2019, NULL  Quantity2019
    FROM 2017

    UNION ALL

    SELECT Item, 
    NULL Price2016, NULL  Quantity2016,
    NULL Price2017,NULL   Quantity2017  
    Price Price2018,Quantity   Quantity2018   
    NULL Price2019, NULL  Quantity2019
    FROM 2018

    UNION ALL

    SELECT Item, 
    NULL Price2016, NULL Quantity2016,
    NULL Price2017,NULL   Quantity2017  
    NULL Price2018,NULL   Quantity2018   
    Price Price2019, Quantity Quantity2019
    FROM 2019
)A
GROUP BY Item
0 голосов
/ 14 мая 2019

Вы можете попробовать следующий запрос, я использовал T2016, T2017 и т. Д. В качестве имен таблиц для данных, специфичных для года.

select
T16.Item
,T16.Price [Price2016]
,T16.Quantity [Quantity2016]
,T17.Price [Price2017]
,T17.Quantity [Quantity2017]
,T18.Price [Price2018]
,T18.Quantity [Quantity2018]
,T19.Price [Price2019]
,T19.Quantity [Quantity2019]
from 
(select *, ROW_NUMBER() over(Partition by Item order by Price) [row] from T2016) T16
left join (select *, ROW_NUMBER() over(Partition by Item order by Price) [row] from     T2017) T17 on T16.Item=T17.Item and T16.row=T17.row
left join (select *, ROW_NUMBER() over(Partition by Item order by Price) [row] from T2018) T18 on T16.Item=T18.Item and T16.row=T18.row
left join (select *, ROW_NUMBER() over(Partition by Item order by Price) [row] from T2019) T19 on T16.Item=T19.Item and T16.row=T19.row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...