как найти сводный столбец в качестве формата даты - PullRequest
2 голосов
/ 01 октября 2019

Моя таблица содержит шесть столбцов, таких как ID, QC_ID, Employee_ID, Created_Date, Created_By моя исходная таблица выглядит как

ID|QC_ID|Employee_ID|Status|Created_Date|Created_By
__|_____|___________|______|____________|___________
 1| 1   |   1001    |  P   | 30-08-2019 |  101
 2| 1   |   1002    |  A   | 30-09-2019 |  101
 3| 1   |   1003    |  P   | 30-10 -2019|  101
 4| 1   |   1001    |  A   | 30-10-2019 |  101 
 5| 1   |   1002    |  P   | 30-08-2019 |  101
 6| 1   |   1002    |  A   | 30-10-2019 |  101
 7| 1   |   1003    |  A   | 30-08-2019 |  101
 8| 1   |   1003    |  A   | 30-09-2019 |  101
 9| 1   |   1001    |  A   | 30-09-2019 |  101


and my pivote table should be look like:

ID|QC_ID|Employee_ID|30-08-2019|30-09-2019|30-10-2019
__|_____|___________|__________|__________|___________
 1| 1   |   1001    |   P      |   A      |  A
 2| 1   |   1002    |   P      |   A      |  A
 3| 1   |   1003    |   A      |   A      |  P

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Предполагая, что вы хотите ДИНАМИЧНЫЙ ПИВОТ

Пример

Declare @SQL varchar(max) = '
Select *
 From  (
        Select ID  = min(ID) over (partition by Employee_ID)
              ,QC_ID
              ,Employee_ID
              ,Status
              ,Created_Date = convert(date,Created_Date)
          From YourTable
       ) A
 Pivot (max([Status]) For [Created_Date] in (' + Stuff((Select Distinct ','+QuoteName(convert(date,Created_Date)) 
                                                          From YourTable A  
                                                          Order By 1 
                                                          For XML Path('')),1,1,'')  + ') ) p'
--Print @SQL
Exec(@SQL)

Возвращает

ID  QC_ID   Employee_ID 2019-08-30  2019-09-30  2019-10-30
1   1       1001        P           A           A
2   1       1002        P           A           A
3   1       1003        A           A           P
1 голос
/ 01 октября 2019

Можно использовать условное агрегирование .

Это решение требует, чтобы вы знали заранее все возможные значения даты (если вы этого не сделаете, вам нужно использовать динамический SQL, который является более сложной техникой).

SELECT
    id,
    qc_id,
    employee_id,
    MAX(CASE WHEN created_date = CAST('2019-08-30' AS DATE) THEN Status END) AS [30-08-2019],
    MAX(CASE WHEN created_date = CAST('2019-09-30' AS DATE) THEN Status END) AS [30-09-2019],
    MAX(CASE WHEN created_date = CAST('2019-10-30' AS DATE) THEN Status END) AS [30-10-2019]
FROM mytable
GROUP BY 
    id,
    qc_id,
    employee_id
...