Как передать значение выбранного столбца основной таблицы в качестве имени столбца подзапроса в SQL Server - PullRequest
0 голосов
/ 03 ноября 2019

Есть ли способ передать выбранное значение столбца таблицы в подзапрос?

Например, у меня есть таблица Stock, у нее есть некоторый простой раздел: A_Stock, B_Stock, C_Stock, как ...

| Item Code    | A_Stock  | B_Stock  | C_Stock 
+--------------+----------+----------+---------
| Item1        | 10       |  13      |   35    
| Item2        | 15       |  20      |   45    
| Item3        |  8       |   6      |   33    

И я выбираю ItemCode и Section (A, B ...) из этой таблицы Как

SELECT ItemCode, Section  
FROM tableName

| Item Code    | Section  
+--------------+---------
| Item1        | A       
| Item3        | C       
| Item2        | B       

Затем я хочу выбрать Item мудрый раздел stock

Ожидаемый результат

SELECT
    ItemCode, 
    (SELECT CONCAT(ST.SectionFrom, '_Stock') firstTable 
     WHERE ItemCode = ST.ItemCode) AS Stock
FROM 
    secondTable ST

| Item Code     | Stock 
+---------------+-------
| Item1         |  10   
| Item3         |  33   
| Item2         |  20  

Но фактический результат:

| Item Code     | Stock    
+---------------+----------
| Item1         | A_Stock  
| Item3         | C_Stock  
| Item3         | B_Stock  

Если у кого-то есть решение, пожалуйста, помогите мне.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Один из подходов к этому - отключить данные и присоединиться:

select st.*, v.stock
from stocktable st cross apply
     (values ('A', a_stock), ('B', b_stock), ('C', c_stock)
     ) v(section, stock) join
     tablename t
     on t.item_code = st.item_code and t.section = v.section;

Мне нравится это решение, потому что оно намекает на то, как на самом деле вы должны хранить данные в таблице stock. В общем, вы не хотите, чтобы несколько столбцов отличались только числами. Вам нужна таблица с тремя столбцами itemcode, section и stock.

2 голосов
/ 03 ноября 2019

Вы можете присоединиться к этим таблицам и использовать выражение case..when:

SELECT ItemCode, 
       (case 
        when section = 'A' then A_Stock 
        when section = 'B' then B_Stock 
        when section = 'C' then C_Stock      
        end ) AS Stock
  FROM secondTable ST
  JOIN stock S
    ON S.ItemCode = ST.ItemCode
0 голосов
/ 03 ноября 2019
-- Here is a solution that is not preferred as it hard codes the column names.  
--DROP TABLE firsttable
CREATE TABLE firsttable
(
    [Item_Code] nvarchar(8)
    ,[A_Stock] int
    ,[B_Stock] int
    ,[C_Stock] int
)

--DROP TABLE secondtable
CREATE TABLE secondtable
(
    [Item_Code] nvarchar(8)
    ,[Section] nvarchar(1)
)

INSERT INTO firsttable ([Item_Code],[A_Stock],[B_Stock],[C_Stock])
    VALUES  ('Item1', 10, 13, 35)
    ,('Item2', 15, 20, 45)
    ,('Item3', 8, 6, 33)

SELECT * FROM firsttable

INSERT INTO secondtable ([Item_Code],[Section])
    VALUES  ('Item1', 'A')
    ,('Item2', 'B')
    ,('Item3', 'C')

SELECT  * FROM secondtable

SELECT f.Item_Code
,(  CASE 
    WHEN CONCAT(s.Section,'_Stock') = 'A_Stock'THEN A_Stock
    WHEN CONCAT(s.Section,'_Stock') = 'B_Stock' THEN B_Stock
    ELSE C_Stock
    END
)
AS Stock

FROM firsttable f, secondtable s
WHERE f.Item_Code = s.Item_Code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...